Log in
Linked Applications
Loading…
پرتال نیکان
Spaces
People
eazyBI
Create
Create
Hit enter to search
Help
Online Help
Keyboard Shortcuts
Feed Builder
What’s new
Available Gadgets
About Confluence
Log in
مدیریت تجهیزات پزشکی
Pages
مدیریت تجهیزات پزشکی Home
داشبورد
داشبورد
search
attachments
weblink
advanced
image-attributes
image-effects
Paragraph
Paragraph
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
Preformatted
Quote
Bold
Italic
Underline
Colour picker
More colours
Formatting
Strikethrough
Subscript
Superscript
Monospace
Clear formatting
Bullet list
Numbered list
Task list
Outdent
Indent
Align left
Align center
Align right
Page layout
Link
Table
Insert
Insert content
Files and images
Link
Markup
Horizontal rule
Task list
Date
Symbol
Insert macro
User mention
Table Plus
Jira Issue/Filter
Info
Status
Gallery
Table of Contents
Other macros
Page layout
No layout
Two column (simple)
Two column (simple, left sidebar)
Two column (simple, right sidebar)
Three column (simple)
Two column
Two column (left sidebar)
Two column (right sidebar)
Three column
Three column (left and right sidebars)
Undo
Redo
Find/Replace
Keyboard shortcuts help
You are not logged in. Any changes you make will be marked as
anonymous
. You may want to
Log In
if you already have an account.
This page is also being edited by
. Your changes will be merged with theirs when you save.
<table class="wysiwyg-macro" data-macro-name="html" data-macro-id="5149d0ca-daf4-4fb5-bc55-9e67d12ee8d9" aria-label="html macro" data-macro-schema-version="1" style="background-image: url(https://kb.h-soft.ir/plugins/servlet/confluence/placeholder/macro-heading?definition=e2h0bWx9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre><style> /* MEDIQ V48 - New workspaces and consolidated request dialog */ #mediq-dashboard .mq-v48-title{display:flex;align-items:center;justify-content:space-between;gap:12px} #mediq-dashboard .mq-v48-title h3{font-size:19px!important;color:#176b96!important} #mediq-dashboard .mq-v48-title p{font-size:12px;color:#6a879d} #mediq-dashboard .mq-v48-filters{margin:18px 0!important} #mediq-dashboard .mq-v48-warning{padding:22px;border:1px dashed #d7ab77;background:#fffaf2;color:#835321;border-radius:12px;line-height:2} #mediq-dashboard .mm-card-home .mm-category-grid{grid-template-columns:repeat(3,minmax(0,1fr))!important} .mm-request-box .mm-request-body{background:linear-gradient(#f7fbff,#fff 240px)!important} .mm-request-box .mm-form-section{box-shadow:0 4px 18px rgba(26,90,130,.06)!important} .mm-request-box .mq-v47-action{border-top:3px solid #3997c8!important} .mm-request-box .mm-transition-tile{cursor:pointer!important;transition:transform .18s,box-shadow .18s,background .18s!important} .mm-request-box .mm-transition-tile:hover,.mm-request-box .mm-transition-tile:focus-visible{transform:translateY(-4px)!important;box-shadow:0 9px 24px #227eaa30!important} .mm-request-box .mm-transition-tile.chosen{border-color:#148acc!important} .mm-request-box #mmEditPriority{display:none!important} .mm-request-box .mm-compact-attachments{align-self:stretch;min-width:0} #mediq-dashboard #mufRoot .muf-stats{margin-top:16px!important} #mediq-dashboard #mufRoot .muf-tabs{margin-top:16px!important} #mediq-dashboard #mufRoot .mq-v47-newfault{animation:mqV48Signal 3s ease-in-out infinite} #mediq-dashboard #mufRoot .mq-v47-newfault:hover{animation:none;transform:translateY(-4px) rotate(-1deg)!important} @keyframes mqV48Signal{0%,85%,100%{box-shadow:0 0 0 0 #de424b00}90%{box-shadow:0 0 0 7px #de424b22}} @media(max-width:930px){#mediq-dashboard .mm-card-home .mm-category-grid{grid-template-columns:repeat(2,minmax(0,1fr))!important}} @media(max-width:600px){#mediq-dashboard .mm-card-home .mm-category-grid{grid-template-columns:1fr!important}.mq-v48-title{flex-direction:column;align-items:flex-start!important}} @media(prefers-reduced-motion:reduce){#mediq-dashboard #mufRoot .mq-v47-newfault{animation:none!important}} /* MEDIQ V49.16 - user-fault focused layout */ #mediq-dashboard #mufRoot .muf-list-shell{grid-template-columns:minmax(0,1.45fr) minmax(310px,.85fr)!important;gap:12px!important} #mediq-dashboard #mufRoot .muf-side-panel{padding:10px!important;min-height:0!important;max-height:calc(100vh - 205px);overflow:auto} #mediq-dashboard #mufRoot .muf-side-box{margin-top:7px!important;padding:9px!important} #mediq-dashboard #mufRoot .muf-side-title.compact{margin:6px 0!important} #mediq-dashboard #mufRoot .muf-user-fault-facts{gap:6px!important} #mediq-dashboard #mufRoot .muf-user-fault-facts>div{padding:7px!important;min-height:38px!important} #mediq-dashboard #mufRoot .muf-user-fault-facts small{display:block;color:#7692a6} #mediq-dashboard #mufRoot .muf-desc-readonly{white-space:normal;line-height:1.8;max-height:120px;overflow:auto} #mediq-dashboard #mufRoot .muf-asset-ref{display:block;margin-top:6px} #mediq-dashboard #mufRoot #mufTechnicianMessage{display:block;width:100%;box-sizing:border-box;min-height:76px;border:1px solid #cde0ed;border-radius:9px;padding:9px;font:inherit;resize:vertical} #mediq-dashboard #mufRoot .muf-hint{color:#68889d;font-size:11px;line-height:1.7;margin:5px 0} #mediq-dashboard #mufRoot .muf-close-action{background:#e34b58!important;color:#fff!important;border-color:#e34b58!important} #mediq-dashboard #mufRoot .muf-csat-info{padding:9px;border-radius:9px;background:#f0f7fd;color:#48738a;font-size:11px;line-height:1.8;margin-top:8px} #mediq-dashboard #mufRoot .muf-create-row{grid-template-columns:minmax(180px,1.1fr) minmax(270px,1.6fr) minmax(120px,.7fr) minmax(220px,1.25fr) auto!important;align-items:end!important} #mediq-dashboard #mufRoot .muf-create-row>label,#mediq-dashboard #mufRoot .muf-urgency-picker{min-width:0;align-self:stretch;display:flex;flex-direction:column;justify-content:flex-end;gap:5px} #mediq-dashboard #mufRoot .muf-create-row textarea{box-sizing:border-box;min-height:48px!important;height:48px!important;margin:0!important} #mediq-dashboard #mufRoot .muf-urgency-picker>span{font-weight:700;font-size:12px;color:#275775} #mediq-dashboard #mufRoot .muf-priority-choices{display:flex;align-items:stretch;gap:4px;border:1px solid #cee2f0;border-radius:10px;padding:4px;background:#f6fbff;min-height:48px;box-sizing:border-box} #mediq-dashboard #mufRoot .muf-priority-choice{border:1px solid transparent;background:transparent;border-radius:7px;cursor:pointer;flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;padding:2px 1px;transition:transform .2s,background .2s,border-color .2s} #mediq-dashboard #mufRoot .muf-priority-choice:hover{transform:translateY(-3px);background:#e4f4ff} #mediq-dashboard #mufRoot .muf-priority-choice.active{background:#def1fc;border-color:#409fd2;box-shadow:0 0 0 1px #409fd233} #mediq-dashboard #mufRoot .muf-priority-choice img{height:21px;width:21px;object-fit:contain} #mediq-dashboard #mufRoot .muf-priority-choice small{font-size:9px;white-space:nowrap;color:#35617d} @media(max-width:1200px){#mediq-dashboard #mufRoot .muf-create-row{grid-template-columns:1fr 1.5fr!important}#mediq-dashboard #mufRoot .muf-list-shell{grid-template-columns:1fr!important}#mediq-dashboard #mufRoot .muf-side-panel{max-height:none!important}} @media(max-width:620px){#mediq-dashboard #mufRoot .muf-create-row{grid-template-columns:1fr!important}#mediq-dashboard #mufRoot .muf-priority-choices{flex-wrap:wrap}} /* MEDIQ V49.29 - User-scoped read acknowledgments */ #mediq-dashboard .mq-handover-row-actions{display:flex;flex-direction:column;align-items:center;gap:5px;min-width:165px} #mediq-dashboard .mq-handover-row-actions .mq-assets-btn{width:100%;max-width:205px;font-size:11px;white-space:normal;line-height:1.7} #mediq-dashboard .mq-handover-row-actions .mq-mark-read{background:#f0fbf6;border-color:#8bd4af;color:#087c54} #mediq-dashboard .mq-handover-row-actions .mq-handover-read-ok{font-size:11px;color:#087c54;font-weight:700} #mediq-dashboard .mq-v50-new-badge{background:#e4404c!important;color:white!important} /* MEDIQ CSAT Candylio integration */ #mediq-dashboard .mq-csat-categories{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0} #mediq-dashboard .mq-csat-choice{display:flex;align-items:center;gap:6px;padding:7px 10px;border:1px solid #c5dff0;border-radius:8px;background:#f6fbff;color:#315873;font-size:12px;cursor:pointer} #mediq-dashboard .mq-csat-choice input{width:15px;height:15px;min-height:0;margin:0;accent-color:#298dc2} #mediq-dashboard .mq-v4928-rating button{font-size:26px!important} </style> <style> /* V38.20 - clickable KPI cards, activity-aligned detail panel, live workflow pulse */ #mediq-dashboard #mmContent .mm-kpi-card{background:#fff;border:1px solid #cbdfea;border-radius:16px;padding:30px;display:flex;flex-direction:column;gap:12px;cursor:pointer;transition:border-color .18s,background .18s,box-shadow .18s;text-align:right;font:inherit;color:inherit} #mediq-dashboard #mmContent .mm-kpi-card strong{font-size:30px;color:#318fbd} #mediq-dashboard #mmContent .mm-kpi-card:hover{border-color:#3595c4;background:#f5fbff} #mediq-dashboard #mmContent .mm-kpi-card.active{border:2px solid #328fc2;background:#eaf6ff;box-shadow:0 0 0 2px #d6edf9 inset} #mediq-dashboard #mmContent .mm-kpi-card:focus-visible{outline:3px solid #2e92ca;outline-offset:2px} #mediq-dashboard #mmContent.mm-with-fixed-side{display:block!important} #mediq-dashboard #mmContent .mm-permanent-panel{float:left!important;position:sticky!important;top:16px!important;left:auto!important;bottom:auto!important;display:block;width:315px!important;max-height:calc(100vh - 34px)!important;margin:0 14px 18px 0!important;box-sizing:border-box;z-index:3;border:1px solid #cee0ee;border-radius:14px;box-shadow:none;padding:14px;overflow:auto} #mediq-dashboard #mmContent .mm-permanent-panel[hidden]{display:none!important} #mediq-dashboard #mmContent.mm-with-fixed-side #mmRows,#mediq-dashboard #mmContent.mm-with-fixed-side .mm-actionbar{margin-left:330px!important;min-width:0} #mediq-dashboard .mm-workflow .mm-stage.current:before{animation:mediqV3820Pulse 1.1s ease-in-out infinite!important;will-change:box-shadow,transform;} @keyframes mediqV3820Pulse{0%,100%{box-shadow:0 0 0 3px #dff1fc,0 0 0 5px rgba(30,145,199,.72);transform:scale(1);opacity:1}50%{box-shadow:0 0 0 3px #dff1fc,0 0 0 15px rgba(30,145,199,0);transform:scale(1.18);opacity:.52}} @media(max-width:900px){#mediq-dashboard #mmContent .mm-permanent-panel{float:none!important;position:relative!important;width:100%!important;max-height:none!important;top:0!important;margin:0 0 12px!important}#mediq-dashboard #mmContent.mm-with-fixed-side #mmRows,#mediq-dashboard #mmContent.mm-with-fixed-side .mm-actionbar{margin-left:0!important}} /* MediQ V39: visual refresh while retaining brand colors */ #mediq-dashboard .mm-category-icon{width:74px!important;height:74px!important;background:#e7f4fc!important;color:#2688bd!important;border-radius:18px!important} #mediq-dashboard .mm-category-icon svg{width:46px!important;height:46px!important;stroke-width:2!important} #mediq-dashboard .mm-category-card{border-color:#c5e2f3!important;box-shadow:0 9px 28px rgba(32,103,146,.08)!important} #mediq-dashboard .mm-category-card:hover{box-shadow:0 16px 36px rgba(32,103,146,.15)!important} #mediq-dashboard .mm-kpi-card{position:relative;border-radius:16px!important;border:1px solid #c8dfed!important;box-shadow:0 5px 16px rgba(22,85,124,.07)!important;text-align:right!important;direction:rtl!important;transition:transform .14s,box-shadow .14s!important} #mediq-dashboard .mm-kpi-card:hover{transform:translateY(-3px);box-shadow:0 9px 24px rgba(26,91,128,.13)!important} #mediq-dashboard .mm-kpi-card.active{background:#e9f6ff!important;border-color:#3197cc!important} #mediq-dashboard .mm-kpi-card strong{color:#208ac2!important;font-size:29px!important} #mediq-dashboard #mmContent .mm-two-pane{direction:rtl} #mediq-dashboard #mmContent th{background:#eaf4fb!important;color:#245978!important} #mediq-dashboard #mmContent tr:hover td{background:#f2f9fe} #mediq-dashboard .mm-issue-overlay .mm-permanent-panel,#mediq-dashboard #mmPermanentIssue{width:min(46vw,610px)!important;max-width:calc(100vw - 20px)!important;box-shadow:0 8px 28px rgba(24,70,100,.13)!important} #mediq-dashboard #mmPermanentIssue .mm-detail-card{border-color:#c6e2f1!important;box-shadow:0 3px 9px rgba(20,85,125,.04)} .mm-request-box .mm-request-grid{grid-template-columns:repeat(2,minmax(0,1fr))!important} .mm-request-box .mm-form-section{box-shadow:0 3px 14px rgba(32,91,126,.06);border-color:#cce4f3!important} .mm-request-box .mm-form-section h4{font-size:16px!important;color:#136b9e!important} .mm-request-box .mm-transition-tiles{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0} .mm-request-box .mm-transition-tile{border:1px solid #b9dced;border-radius:11px;background:#f4faff;color:#245d7c;font:inherit;font-weight:750;padding:10px 16px;cursor:pointer} .mm-request-box .mm-transition-tile.chosen{border-color:#208cc6;background:#d7efff;color:#075b8e;box-shadow:0 0 0 2px #c5e8fc} .mm-request-box .mm-current-stage{background:#e7f6ef;border:1px solid #bce3d1;color:#177453;font-weight:800;border-radius:10px;padding:10px 12px} .mm-discard-overlay[hidden]{display:none!important}.mm-discard-overlay{position:absolute;inset:0;background:#1b3c5299;display:grid;place-items:center;z-index:10;border-radius:14px} .mm-discard-card{background:white;direction:rtl;text-align:right;border-radius:15px;padding:26px;max-width:380px;box-shadow:0 20px 55px #11374b44} .mm-discard-card strong{font-size:17px;color:#125f8f}.mm-discard-card>div{display:flex;gap:8px} @media(max-width:850px){#mediq-dashboard #mmPermanentIssue{width:min(95vw,520px)!important}.mm-request-box .mm-request-grid{grid-template-columns:1fr!important}} /* V39 last-in-cascade responsive layout fixes */ #mediq-dashboard .mm-category-icon{width:74px!important;height:74px!important;border-radius:18px!important;background:#e6f5fd!important} #mediq-dashboard .mm-category-icon svg{width:46px!important;height:46px!important} #mediq-dashboard #mmContent .mm-permanent-panel{width:560px!important;max-width:44%!important;float:left!important;top:0!important;margin:0 14px 16px 0!important;max-height:calc(100vh - 26px)!important} #mediq-dashboard #mmContent.mm-with-fixed-side #mmRows,#mediq-dashboard #mmContent.mm-with-fixed-side .mm-actionbar{margin-left:580px!important} #mediq-dashboard #mmPermanentIssue>.mm-detail-card:first-of-type{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 18px} #mediq-dashboard #mmPermanentIssue>.mm-detail-card:first-of-type .mm-detail-line{min-width:0} #mediq-dashboard .mm-kpi-card{direction:rtl!important;text-align:right!important;border-radius:16px!important;box-shadow:0 5px 16px #20678c12!important} @media(max-width:1040px){#mediq-dashboard #mmContent .mm-permanent-panel{width:42%!important;max-width:42%!important}#mediq-dashboard #mmContent.mm-with-fixed-side #mmRows,#mediq-dashboard #mmContent.mm-with-fixed-side .mm-actionbar{margin-left:44%!important}} @media(max-width:760px){#mediq-dashboard #mmContent .mm-permanent-panel{position:relative!important;width:100%!important;max-width:100%!important;float:none!important;max-height:70vh!important}#mediq-dashboard #mmContent.mm-with-fixed-side #mmRows,#mediq-dashboard #mmContent.mm-with-fixed-side .mm-actionbar{margin-left:0!important}}</style> <style> /* MEDIQ: vertical workflow timeline, same asset-status visual language */ #mediq-dashboard .mm-stage-grid{display:flex!important;flex-direction:column!important;gap:0!important;margin:14px 0!important;direction:rtl} #mediq-dashboard .mm-stage{position:relative;display:flex!important;align-items:center;gap:12px;min-height:60px;text-align:right!important;padding:7px 5px!important;border:0!important;border-radius:0!important;background:transparent!important;color:#758e9f!important;font-size:12px!important;line-height:1.7} #mediq-dashboard .mm-stage:before{content:'';display:block;width:19px;height:19px;flex:0 0 19px;border-radius:50%;background:#e0eaf0;border:2px solid #c9dbe6;box-shadow:0 0 0 3px #fff;position:relative;z-index:2} #mediq-dashboard .mm-stage:not(:last-child):after{content:'';position:absolute;right:15px;top:40px;bottom:-20px;width:3px;background:#d7e5ed;z-index:0} #mediq-dashboard .mm-stage.done{color:#23865e!important;font-weight:700} #mediq-dashboard .mm-stage.done:before{content:'✓';background:#1aaf68;color:white;border-color:#1aaf68;text-align:center;font-size:13px;line-height:17px} #mediq-dashboard .mm-stage.done:after{background:#1aaf68} #mediq-dashboard .mm-stage.current{color:#147fac!important;font-weight:900!important} #mediq-dashboard .mm-stage.current:before{background:#168bc0;border:5px solid #b5e4f8;box-shadow:0 0 0 4px #e7f5fc} /* V38.18: pulse only the CURRENT maintenance workflow stage, matching asset timeline */ #mediq-dashboard .mm-workflow .mm-stage.current::before{ animation:mediqMaintenanceCurrentPulse 1.55s ease-in-out infinite; transform-origin:center center; } @keyframes mediqMaintenanceCurrentPulse{ 0%,100%{box-shadow:0 0 0 4px #e7f5fc,0 0 0 7px rgba(22,139,192,.28);opacity:1} 50%{box-shadow:0 0 0 4px #e7f5fc,0 0 0 15px rgba(22,139,192,0);opacity:.72} } @media(prefers-reduced-motion:reduce){ #mediq-dashboard .mm-workflow .mm-stage.current::before{animation:none} } #mediq-dashboard .mm-workflow .mm-hint{font-size:11px;line-height:1.9} </style> <style> /* MediQ V38.16: sidebar parity and workflow summary */ #mediq-dashboard .mq-tree-v31 .v32-tree-children .mq-tree-row.level-2{font-size:14px!important;font-weight:650!important;min-height:42px!important;line-height:1.75!important} #mediq-dashboard .mm-stage-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px;margin:12px 0} #mediq-dashboard .mm-stage{padding:10px 7px;border-radius:9px;text-align:center;background:#f2f7fa;color:#54768d;border:1px solid #d5e4ee;font-size:12px} #mediq-dashboard .mm-stage.current{border-color:#318fc3;background:#dff2ff;color:#11577f;font-weight:800} #mediq-dashboard .mm-workflow h4{font-size:15px;margin-bottom:9px} #mediq-dashboard .mm-request-box button{font-family:inherit;font-size:14px;border-radius:8px} #mediq-dashboard .mm-request-box .mm-actions .mq-assets-btn{min-height:38px;padding:9px 16px} @media(max-width:650px){#mediq-dashboard .mm-stage-grid{grid-template-columns:1fr 1fr}} /* MEDIQ PRESENTATION: focused and polished request editor */ .mm-request-modal{z-index:1000100!important;padding:18px!important} .mm-request-box{width:min(980px,96vw)!important;max-height:90vh!important;display:flex!important;flex-direction:column!important;padding:0!important;overflow:hidden!important;border:1px solid #c9dfed!important;border-radius:17px!important;direction:rtl!important;text-align:right!important} .mm-request-box>header{padding:19px 24px!important;position:sticky;top:0;background:#fff;z-index:3;flex-shrink:0;box-shadow:0 3px 12px #184d6409} .mm-request-box>header h3{font-size:18px!important;margin:0!important} .mm-request-body{padding:6px 24px 24px;overflow-y:auto;flex:1;min-height:0;scrollbar-width:thin} .mm-request-box .mm-form-section{padding:19px!important;margin:16px 0!important;border-radius:12px!important;background:#fff!important} .mm-request-box .mm-form-section h4{font-size:15px!important;margin:0 0 18px!important} .mm-request-box .mm-request-grid{gap:17px!important;align-items:start} .mm-request-box .mm-request-grid label{display:flex!important;flex-direction:column!important;gap:5px;font-size:13px!important;color:#245574!important} .mm-request-box .mm-request-grid input,.mm-request-box .mm-request-grid select,.mm-request-box .mm-request-grid textarea{min-height:43px!important;font-size:13px!important;margin:0!important;text-align:right!important;direction:rtl!important} .mm-request-box .mm-request-grid textarea{min-height:100px!important;line-height:1.8!important} .mm-request-box .mm-actions button,.mm-request-box #mmSendComment{border:1px solid #328fbe!important;border-radius:9px!important;min-height:40px!important;padding:9px 16px!important;background:#3997c8!important;color:white!important;font-weight:700!important;cursor:pointer!important} .mm-request-box .mm-actions button:disabled{opacity:.55!important;cursor:wait!important} .mm-request-box #mmSaveIssueResult,.mm-request-box #mmCommentResult{font-size:12px!important;line-height:1.9!important;margin:10px 0 0!important} .mm-request-box .mm-user-menu{position:absolute;top:calc(100% - 1px);left:0;right:0;box-shadow:0 8px 24px #12345622;border-radius:9px;z-index:10} .mm-request-box .mm-request-grid label{position:relative} .mm-request-box .mm-documents{display:flex;flex-wrap:wrap;gap:8px} .mm-request-box .mm-doc-pill{width:auto!important;margin:0!important} @media(max-width:690px){.mm-request-modal{padding:6px!important}.mm-request-box{max-height:98vh!important;width:100%!important}.mm-request-body{padding:4px 12px 16px}.mm-request-box .mm-request-grid{grid-template-columns:1fr!important}.mm-request-box>header{padding:15px!important}} </style> <style> /* MediQ V38.22 — Activity detail panel refinements */ #mediq-dashboard #mmContent.mm-with-fixed-side{ display:grid!important;grid-template-columns:minmax(0,1fr) minmax(285px,310px)!important; column-gap:18px!important;row-gap:12px!important;align-items:start!important; min-width:0!important;overflow:visible!important; } #mediq-dashboard #mmContent.mm-with-fixed-side>.v-stats, #mediq-dashboard #mmContent.mm-with-fixed-side>#mmActivitiesHeading{ grid-column:1/-1!important;min-width:0!important; } #mediq-dashboard #mmContent.mm-with-fixed-side>.v-stats{grid-row:1!important} #mediq-dashboard #mmContent.mm-with-fixed-side>#mmActivitiesHeading{grid-row:2!important;margin:8px 0 0!important} #mediq-dashboard #mmContent.mm-with-fixed-side>#mmPermanentIssue{ grid-column:2!important;grid-row:3/span 2!important;float:none!important; position:sticky!important;top:12px!important;left:auto!important;right:auto!important;bottom:auto!important; width:100%!important;min-width:0!important;max-width:100%!important; max-height:calc(100vh - 28px)!important;margin:0!important;padding:0 12px 16px!important; overflow-x:hidden!important;overflow-y:auto!important; background:linear-gradient(180deg,#f2f9fe 0,#fff 160px)!important; border:1px solid #b8d8ed!important;border-radius:17px!important; box-shadow:0 9px 30px rgba(25,83,123,.12)!important; color:#174866!important;font-size:13px!important;line-height:1.85!important; box-sizing:border-box!important;isolation:isolate; } #mediq-dashboard #mmContent.mm-with-fixed-side>.mm-actionbar{ grid-column:1!important;grid-row:3!important;margin:0!important;min-width:0!important; } #mediq-dashboard #mmContent.mm-with-fixed-side>#mmRows{ grid-column:1!important;grid-row:4!important;margin:0!important;min-width:0!important; width:100%!important;overflow-x:auto!important; } #mediq-dashboard #mmContent.mm-with-fixed-side>#mmRows .mq-tbl{width:100%!important;max-width:100%!important} #mediq-dashboard #mmPermanentIssue *,#mediq-dashboard #mmPermanentIssue *::before,#mediq-dashboard #mmPermanentIssue *::after{box-sizing:border-box} #mediq-dashboard #mmPermanentIssue>header{ position:sticky;top:0;z-index:5;margin:0 -12px 15px!important;padding:14px 14px!important; background:linear-gradient(115deg,#e1f1fb,#f3faff)!important;border-bottom:1px solid #c5e1f1!important; display:flex;gap:10px;align-items:center;justify-content:space-between; } #mediq-dashboard #mmPermanentIssue>header strong{font-size:14px!important;font-weight:850!important;color:#075b8b!important;overflow-wrap:anywhere} #mediq-dashboard #mmPermanentIssue>header button{flex:0 0 auto;width:30px;height:30px;padding:0!important;font-size:21px!important;background:#fff!important;color:#326b91!important;border:1px solid #cfe2ee!important} #mediq-dashboard #mmPermanentIssue>h3{font-size:14px!important;line-height:1.9!important;font-weight:850!important;color:#174a6d!important;margin:4px 2px 12px!important;overflow-wrap:anywhere;word-break:normal} #mediq-dashboard #mmPermanentIssue .mm-detail-card{ margin:12px 0!important;padding:14px 12px!important;background:#fff!important; border:1px solid #d1e5f3!important;border-right:3px solid #4ca5d1!important;border-radius:12px!important; box-shadow:0 4px 12px rgba(21,84,124,.045)!important;min-width:0!important; } #mediq-dashboard #mmPermanentIssue .mm-detail-card h4{font-size:14px!important;font-weight:850!important;color:#0b628f!important;margin:0 0 12px!important} #mediq-dashboard #mmPermanentIssue .mm-detail-line{align-items:flex-start!important;gap:9px!important;padding:11px 0!important;font-size:12.5px!important} #mediq-dashboard #mmPermanentIssue .mm-detail-line span{color:#687f92!important;flex:0 0 82px!important;font-weight:650!important} #mediq-dashboard #mmPermanentIssue .mm-detail-line strong{color:#163e5a!important;text-align:left!important;flex:1;min-width:0;font-size:13px!important;font-weight:850!important;overflow-wrap:anywhere} #mediq-dashboard #mmPermanentIssue .mm-detail-line:first-child strong{color:#087bb0!important} #mediq-dashboard #mmPermanentIssue input,#mediq-dashboard #mmPermanentIssue textarea{ width:100%!important;min-width:0!important;max-width:100%!important; border:1px solid #c4dff0!important;background:#fbfdff!important;border-radius:9px!important; padding:10px!important;direction:rtl!important;text-align:right!important; font-size:13px!important;color:#204b67!important; } #mediq-dashboard #mmPermanentIssue label{font-size:12px!important;font-weight:750!important;color:#2a6488!important} #mediq-dashboard #mmPermanentIssue button.mq-assets-btn{max-width:100%!important;white-space:normal!important;line-height:1.6!important;font-weight:800!important;border-radius:9px!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage{font-size:12.5px!important;font-weight:700!important;min-width:0!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage.current{font-weight:900!important;color:#0a77ae!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-hint{font-size:11px!important;line-height:1.8!important;color:#7891a3!important} #mediq-dashboard #mmPermanentIssue .mm-user-menu,#mediq-dashboard #mmPermanentIssue .mm-cal{max-width:min(100%,300px)!important} @media(max-width:1000px){ #mediq-dashboard #mmContent.mm-with-fixed-side{grid-template-columns:minmax(0,1fr)!important} #mediq-dashboard #mmContent.mm-with-fixed-side>#mmPermanentIssue{grid-column:1!important;grid-row:3!important;position:relative!important;top:0!important;max-height:470px!important} #mediq-dashboard #mmContent.mm-with-fixed-side>.mm-actionbar{grid-column:1!important;grid-row:4!important} #mediq-dashboard #mmContent.mm-with-fixed-side>#mmRows{grid-column:1!important;grid-row:5!important} } </style> <style> /* MEDIQ V47: action dialog refresh – presentation only */ .mm-request-box .mq-v47-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)} .mm-request-box .mq-v47-product-image{display:block;width:min(240px,100%);height:130px;object-fit:contain;background:#f6fbfe;border:1px solid #d8e8f2;border-radius:12px;margin:8px auto} .mm-request-box .mq-v47-priority{display:flex;align-items:center;gap:8px;min-height:43px;border:1px solid #cfe3f0;border-radius:10px;padding:8px 13px;background:#f3f9fe;color:#245574;font-size:13px} .mm-request-box .mq-v47-priority b{font-size:19px} .mm-request-box input[readonly],.mm-request-box textarea[readonly]{background:#f4f8fb!important;color:#315873!important;cursor:default} .mm-request-box .mq-v47-status{border:1px solid #d0e4f1;border-radius:10px;padding:9px 13px;display:flex;flex-direction:column;gap:5px;background:#f5faff;font-size:12px} .mm-request-box .mq-v47-status span{color:#7290a5}.mm-request-box .mq-v47-status strong{color:#176b9b} .mm-request-box .mq-v47-device{grid-column:1/-1;margin:3px 0!important;padding:12px!important} .mm-request-box .mq-v47-help{color:#7290a5;font-size:12px;margin:0 0 12px} .mm-request-box .mq-v47-actions-container{display:flex;flex-direction:column;gap:10px} .mm-request-box .mq-v47-action .mm-transition-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px} .mm-request-box .mq-v47-action .mm-transition-tile{min-height:62px;text-align:center;font-size:14px;border:1px solid #add4e9!important;border-radius:13px!important;transition:transform .2s,box-shadow .2s,background .2s!important} .mm-request-box .mq-v47-action .mm-transition-tile:hover{transform:translateY(-4px);background:#e6f5ff!important;box-shadow:0 12px 24px #1b82b626!important} .mm-request-box .mq-v47-action .mm-transition-tile.chosen{background:#d6efff!important;box-shadow:0 0 0 2px #b8e2fa!important} .mm-request-box .mq-v47-self{border:0;background:transparent;color:#1682b7;text-decoration:underline;text-align:right;align-self:flex-start;cursor:pointer;font:inherit} .mm-request-box .mq-v47-notes{display:flex;flex-direction:column;gap:10px} .mm-request-box .mq-v47-notes #mmCommentList{order:5} .mm-request-box .mq-v47-notes h5{order:4;margin:10px 0 0;color:#176b9b} .mm-request-box .mq-v47-notes .mm-comment-actions{order:2} .mm-request-box .mq-v47-notes #mmCommentResult{order:3} .mm-request-box .mq-v47-notes>label{order:1} .mm-request-box .mq-v47-notes>h4{order:0} @media(max-width:650px){.mm-request-box .mq-v47-action .mm-transition-tiles{grid-template-columns:1fr 1fr}} </style> <style> /* V47: creation next to refresh, appearance only */ #mediq-dashboard #mufRoot .mq-v47-newfault{background:#dc464d!important;color:#fff!important;border:1px solid #cf3f49!important;border-radius:9px!important;cursor:pointer!important;font-weight:850!important;padding:11px 16px!important;transition:transform .18s,box-shadow .18s!important} #mediq-dashboard #mufRoot .mq-v47-newfault:hover{transform:translateY(-4px) rotate(-1deg)!important;box-shadow:0 12px 24px #d73d4a44!important;background:#bd303b!important} #mediq-dashboard #mufRoot .muf-heading{gap:12px;flex-wrap:wrap} </style> <style id="mediq-v49-precise-overrides"> /* V49 — refinement on the user's exact V48 source; no replacement of core routing */ .mm-request-box{width:min(1000px,97vw)!important;max-height:94vh!important} .mm-request-box>header{padding:13px 20px!important} .mm-request-body{padding:5px 16px 14px!important} .mm-request-box .mm-form-section{margin:9px 0!important;padding:13px!important} .mm-request-box .mm-form-section h4{margin:0 0 10px!important} .mm-request-box .mm-request-grid{gap:10px!important} .mm-request-box .mm-request-grid textarea{min-height:68px!important;max-height:130px!important} .mm-request-box .mm-request-grid input{min-height:39px!important} .mm-request-box .mm-compact-attachments{grid-column:1;min-width:0;margin:0!important;padding:0!important} .mm-request-box .mq-v47-device{padding:9px!important;margin:0!important} .mm-request-box .mq-v47-product-image{height:110px!important;width:min(170px,100%)!important} .mm-request-box .mq-v47-action{border-top:3px solid #258fc5!important;background:linear-gradient(145deg,#fff,#f7fbfe)!important} .mm-request-box .mq-v49-flow{display:flex;align-items:center;flex-wrap:wrap;gap:9px;padding:9px 12px;border:1px solid #d7e9f4;background:#eef8fe;border-radius:10px;color:#2a607f;font-size:12px;margin-bottom:10px} .mm-request-box .mq-v49-now{display:inline-flex;align-items:center;gap:7px} .mm-request-box .mq-v49-now i{width:9px;height:9px;background:#1397cb;border-radius:50%;box-shadow:0 0 0 3px #c7ecfa;animation:mqV49Pulse 1.6s ease-in-out infinite} .mm-request-box .mq-v49-flow-arrow{font-size:21px;color:#3794be} .mm-request-box .mq-v49-next{font-weight:800;color:#166f9e} .mm-request-box .mq-v47-action .mm-transition-tiles{margin:8px 0!important;gap:9px!important} .mm-request-box .mq-v47-action .mm-transition-tile{min-height:51px!important;border:1px solid #a6d3ec!important;background:#fff!important;box-shadow:0 3px 10px #246e9612!important;position:relative} .mm-request-box .mq-v47-action .mm-transition-tile:not(.chosen):hover{transform:translateY(-4px) scale(1.015)!important;background:#e6f6ff!important;box-shadow:0 11px 20px #1b82b62e!important} .mm-request-box .mq-v47-action .mm-transition-tile.chosen{background:#def2ff!important;border-color:#158ac3!important} .mm-request-box .mq-v47-help{margin-bottom:6px!important} .mm-request-box .mq-v47-notes{gap:8px!important} .mm-request-box .mq-v47-notes #mmCommentList{max-height:220px;overflow:auto;border-top:1px solid #e5edf3;margin-top:6px} .mm-request-box .mm-documents{max-height:110px;overflow:auto} #mediq-dashboard #mufRoot .muf-heading{display:flex!important;gap:10px!important;align-items:center!important;flex-wrap:wrap!important} #mediq-dashboard #mufRoot .muf-kpi{transition:transform .18s,box-shadow .18s!important;cursor:pointer!important} #mediq-dashboard #mufRoot .muf-kpi:hover{transform:translateY(-4px)!important;box-shadow:0 12px 28px #276b9b24!important} #mediq-dashboard #mufRoot .muf-kpi.selected{box-shadow:0 0 0 2px #59b0dd inset,0 7px 20px #276b9b14!important} #mediq-dashboard #mufRoot .mq-v47-newfault{background:#dc414e!important;color:#fff!important} #mediq-dashboard #mufRoot .mq-v47-newfault:hover{transform:translateY(-4px) rotate(-1deg)!important;box-shadow:0 12px 26px #b9273d55!important} #mediq-dashboard #mufRoot .muf-urgency-icon{display:inline-flex;align-items:center;justify-content:center;min-width:28px;height:28px;border-radius:9px;background:#e8f3fc;font-size:18px;vertical-align:middle} #mediq-dashboard #mufRoot .muf-urgency-icon[data-level=high]{background:#fff3e2} #mediq-dashboard #mufRoot .muf-urgency-icon[data-level=critical]{background:#ffedf0} #mediq-dashboard .mm-handover-card{font-family:inherit!important} @keyframes mqV49Pulse{50%{box-shadow:0 0 0 9px #1397cb00;transform:scale(1.15)}} @media(max-width:690px){.mm-request-box .mm-request-grid{grid-template-columns:1fr!important}.mm-request-box .mm-compact-attachments{grid-column:1!important}.mm-request-box .mq-v49-flow-arrow{display:none}} @media(prefers-reduced-motion:reduce){.mm-request-box .mq-v49-now i{animation:none}} </style> <style id="mediq-v49-25-patches"> /* MEDIQ V49.25 -- concise cards, active navigation, accessible calendars */ #mediq-dashboard .mm-category-card[data-mq-v48-property]{position:relative;overflow:visible!important;padding:17px!important;min-height:155px!important} #mediq-dashboard .mq-v50-new-badge{position:absolute;top:-10px;left:-10px;display:flex;align-items:center;justify-content:center;width:31px;height:31px;border-radius:50%;color:#fff;background:#e23d4c;border:3px solid white;font:bold 15px Tahoma,Arial,sans-serif;box-shadow:0 4px 14px #d93a4f55;z-index:4} #mediq-dashboard #mmTreeChildren [data-mm-tree].active{background:rgba(255,255,255,.22)!important;color:#fff!important;border-right:3px solid white!important;border-radius:8px;font-weight:850!important} #mediq-dashboard #mqTree .v32-tree-children .mq-tree-row.active{background:#2b83b7!important;color:#fff!important;font-weight:850!important} #mediq-dashboard [data-fin-filter].active,#mediq-dashboard [data-handover-filter].active{background:#e7f4ff!important;border:2px solid #2e94c8!important;box-shadow:inset 0 0 0 1px #d4eafd!important} .mm-t-screen-overlay .mm-date-line{position:relative;display:block} .mm-t-screen-overlay .mm-cal,.mm-request-modal .mm-cal{box-sizing:border-box!important;width:310px!important;max-width:calc(100vw - 28px)!important;border-radius:14px!important;padding:12px!important;background:#fff!important;box-shadow:0 16px 40px rgba(22,64,96,.2)!important;border:1px solid #b8d8ed!important} .mm-t-screen-overlay .mm-cal-days,.mm-request-modal .mm-cal-days{display:grid!important;grid-template-columns:repeat(7,minmax(0,1fr))!important;gap:5px!important;direction:rtl!important} .mm-t-screen-overlay .mm-cal-days>*,.mm-request-modal .mm-cal-days>*{display:flex!important;align-items:center!important;justify-content:center!important;min-width:0!important;height:34px!important;padding:3px!important;font-size:12px!important;border-radius:7px!important;line-height:1.4!important} .mm-t-screen-overlay .mm-cal-days button,.mm-request-modal .mm-cal-days button{background:#f0f8ff!important;color:#215a7c!important;border:1px solid transparent!important;cursor:pointer!important} .mm-t-screen-overlay .mm-cal-days button:hover,.mm-request-modal .mm-cal-days button:hover{background:#3295c7!important;color:white!important} .mm-t-screen-overlay .mm-cal-head,.mm-request-modal .mm-cal-head{display:flex!important;justify-content:space-between!important;align-items:center!important;gap:8px!important;margin-bottom:10px!important} .mm-t-screen-overlay .mm-cal-head button,.mm-request-modal .mm-cal-head button{width:auto!important;min-height:33px!important;font-size:11px!important;border-radius:8px!important;border:1px solid #cce2ef!important;background:#f3faff!important;color:#23668b!important} </style> <div id="mediq-dashboard" dir="rtl"> <style> /* MediQ V38.6 — spacing, compact forms and integrated combobox */ #mediq-dashboard #mmContent .v-fields{display:grid!important;grid-template-columns:repeat(5,minmax(0,1fr))!important;gap:12px!important;align-items:end} #mediq-dashboard #mmContent .v-fields>label{min-width:0;text-align:right;direction:rtl} #mediq-dashboard #mmContent .v-fields input,#mediq-dashboard #mmContent .v-fields select{width:100%;min-width:0;box-sizing:border-box} #mediq-dashboard #mmContent .v-fields textarea{min-height:42px} #mediq-dashboard #mmContent .mm-search-spaced{margin:22px 0 15px} #mediq-dashboard #mmContent #mmEquipSearch{margin:22px 0 15px!important} #mediq-dashboard .mm-combo{position:relative;min-width:0} #mediq-dashboard .mm-combo-menu{position:absolute;z-index:1001;top:calc(100% + 4px);right:0;left:0;max-height:240px;overflow:auto;background:#fff;border:1px solid #cfe2ed;border-radius:9px;box-shadow:0 12px 26px #143a531f;padding:5px} #mediq-dashboard .mm-combo-menu[hidden]{display:none!important} #mediq-dashboard .mm-combo-menu button{display:block;text-align:right;direction:rtl;width:100%;background:#fff;color:#23536e;border:0;border-radius:6px;padding:9px;cursor:pointer;font:inherit} #mediq-dashboard .mm-combo-menu button:hover{background:#eaf5fb} #mediq-dashboard .mm-combo-empty{display:block;padding:10px;color:#668197} #mediq-dashboard .mm-attachment-label small{display:block;font-size:10px;color:#69849a;margin-top:4px} #mediq-dashboard .mm-attachment-label input[type=file]{font-size:11px;direction:rtl;border:1px dashed #bcd8e8;border-radius:8px;padding:6px;background:#f8fcfe} @media(max-width:1250px){#mediq-dashboard #mmContent .v-fields{grid-template-columns:repeat(3,minmax(0,1fr))!important}} @media(max-width:760px){#mediq-dashboard #mmContent .v-fields{grid-template-columns:repeat(2,minmax(0,1fr))!important}} @media(max-width:480px){#mediq-dashboard #mmContent .v-fields{grid-template-columns:1fr!important}} /* MEDIQ V38.8 - maintenance refinements */ #mediq-dashboard #mmContent .mq-tbl th,#mediq-dashboard #mmContent .mq-tbl td{text-align:center;vertical-align:middle} #mediq-dashboard #mmContent .mm-plan-form .mq-preview{margin-top:10px!important} #mediq-dashboard #mmContent .mq-preview{min-height:unset;box-shadow:none} #mediq-dashboard #mmContent .v-fields>label{min-width:0;display:flex;flex-direction:column;gap:7px;text-align:right;font-size:13px;font-weight:650} #mediq-dashboard #mmContent .v-fields input,#mediq-dashboard #mmContent .v-fields select,#mediq-dashboard #mmContent .v-fields textarea{height:42px;min-height:42px;font-size:13px;border-radius:10px;background:#fff;width:100%;box-sizing:border-box} #mediq-dashboard #mmContent .v-fields textarea{height:42px;resize:vertical;min-height:42px;padding:11px} #mediq-dashboard #mmContent .v-fields>label:focus-within{color:#2476a3} #mediq-dashboard #mmContent .v-fields input:focus,#mediq-dashboard #mmContent .v-fields select:focus,#mediq-dashboard #mmContent .v-fields textarea:focus{outline:2px solid #b8e3fa;outline-offset:1px;border-color:#409cc7} #mediq-dashboard #mmContent .mm-combo{position:relative;width:100%;min-width:0} #mediq-dashboard #mmContent .mm-combo-menu{position:absolute;top:calc(100% + 4px);right:0;left:0;max-height:260px;overflow:auto;background:#fff;box-shadow:0 14px 28px rgba(20,62,92,.16);border:1px solid #c7dfe9;border-radius:10px;z-index:600;padding:5px} #mediq-dashboard #mmContent .mm-combo-menu[hidden]{display:none} #mediq-dashboard #mmContent .mm-combo-menu button{display:block;width:100%;border:0;background:transparent;color:#194b6a;text-align:right;padding:9px 10px;white-space:normal;cursor:pointer;font-size:12px;border-radius:7px} #mediq-dashboard #mmContent .mm-combo-menu button:hover{background:#eaf6fc} #mediq-dashboard #mmContent .mm-plan-form .v-fields{grid-template-columns:repeat(6,minmax(0,1fr))!important} #mediq-dashboard .mm-issue-drawer{width:min(510px,95vw)} #mediq-dashboard .mm-issue-drawer .mm-issue-fields{border:1px solid #d7e7f0;border-radius:12px;padding:16px;background:#fff} #mediq-dashboard .mm-issue-drawer .mm-issue-fields>div{display:flex;justify-content:space-between;gap:12px;padding:12px 0;border-bottom:1px solid #e7eff4} #mediq-dashboard .mm-issue-drawer .mm-issue-fields>div:last-child{border-bottom:0} #mediq-dashboard .mm-issue-drawer .mm-issue-fields span{color:#608099} #mediq-dashboard .mm-issue-drawer .mm-issue-fields strong{color:#154d71;text-align:left} #mediq-dashboard .mm-issue-drawer .mm-issue-actions{margin-top:16px} #mediq-dashboard #mmContent .mm-attachment-label{justify-content:flex-start} @media(max-width:1250px){#mediq-dashboard #mmContent .mm-plan-form .v-fields{grid-template-columns:repeat(3,minmax(0,1fr))!important}} @media(max-width:670px){#mediq-dashboard #mmContent .mm-plan-form .v-fields{grid-template-columns:1fr!important}} #mediq-dashboard .mm-plan-form .v-fields{grid-template-columns:repeat(7,minmax(0,1fr))} #mediq-dashboard #mmContent .mq-tbl th,#mediq-dashboard #mmContent .mq-tbl td{text-align:center;vertical-align:middle} #mediq-dashboard #mmContent .mq-tbl tbody tr:has([data-mm-issue]):hover{background:#f0f8fd} #mediq-dashboard .mm-attachment-label input[type=file]{width:100%} @media(max-width:1150px){#mediq-dashboard .mm-plan-form .v-fields{grid-template-columns:repeat(3,minmax(0,1fr))}} @media(max-width:650px){#mediq-dashboard .mm-plan-form .v-fields{grid-template-columns:1fr}} #mediq-dashboard .mm-edit-identity{padding:12px 16px;margin:10px 0;border:1px solid #8cc6e6;background:#eef8fd;border-radius:10px;font-weight:800;color:#175c81;text-align:right;} #mediq-dashboard .mm-edit-identity[hidden]{display:none!important} #mediq-dashboard .mm-plan-form .v-fields{grid-template-columns:repeat(4,minmax(0,1fr));} @media(max-width:950px){#mediq-dashboard .mm-plan-form .v-fields{grid-template-columns:repeat(2,minmax(0,1fr));}} @media(max-width:560px){#mediq-dashboard .mm-plan-form .v-fields{grid-template-columns:1fr;}} /* MediQ V38.12: aligned forms and full row edit selection */ #mediq-dashboard .mm-plan-row-selected, #mediq-dashboard .mm-plan-row-selected td{background:#e1f3fe!important;color:#14587e!important;} #mediq-dashboard .mm-plan-row-selected td:first-child{box-shadow:inset -4px 0 0 #318fc3;} #mediq-dashboard .mm-plan-row-selected td{border-top:1px solid #80c2e9!important;border-bottom:1px solid #80c2e9!important;} #mediq-dashboard .mm-main, #mediq-dashboard .mm-main form, #mediq-dashboard #mmContent, #mediq-dashboard #mmContent input, #mediq-dashboard #mmContent textarea, #mediq-dashboard #mmContent select, #mediq-dashboard #mmContent table{direction:rtl;text-align:right;} #mediq-dashboard #mmContent .mq-tbl th,#mediq-dashboard #mmContent .mq-tbl td{text-align:right;} #mediq-dashboard .mm-main,#mediq-dashboard .mm-main input,#mediq-dashboard .mm-main select,#mediq-dashboard .mm-main button,#mediq-dashboard .mm-main textarea{font-size:14px;direction:rtl} #mediq-dashboard .mm-main th,#mediq-dashboard .mm-main td{text-align:right;vertical-align:middle} #mediq-dashboard .mm-issue-drawer{font-size:14px;direction:rtl} #mediq-dashboard .mm-report-form{border:1px solid #d5e6f0;border-radius:12px;padding:14px;margin-top:14px} #mediq-dashboard .mm-report-form h4{margin:0 0 12px;font-size:16px} #mediq-dashboard .mm-report-form label{display:block;margin:8px 0} #mediq-dashboard .mm-report-form input,#mediq-dashboard .mm-report-form textarea{display:block;width:100%;box-sizing:border-box;border:1px solid #cde0ed;border-radius:8px;padding:10px;font:inherit;direction:rtl} #mediq-dashboard .mm-report-form p{font-size:12px;color:#627e91} #mediq-dashboard .mm-permanent-panel{position:fixed;left:0;top:104px;bottom:0;width:min(395px,35vw);z-index:8000;overflow-y:auto;background:#fff;border-right:1px solid #cee0ee;box-shadow:8px 0 22px #173b5517;padding:18px;direction:rtl;text-align:right;color:#194965;font-size:13px} #mediq-dashboard .mm-permanent-panel[hidden]{display:none} #mediq-dashboard .mm-permanent-panel header,.mm-request-box header{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #d9e8f2;padding-bottom:12px} #mediq-dashboard .mm-permanent-panel header button,.mm-request-box header button{border:0;border-radius:8px;background:#edf6fb;font-size:23px;cursor:pointer;padding:3px 11px} #mediq-dashboard .mm-detail-card{border:1px solid #d1e6f3;border-radius:12px;padding:13px;margin:11px 0;background:#fff} #mediq-dashboard .mm-detail-card label,.mm-request-box label{display:block;font-weight:650;margin:10px 0;position:relative} #mediq-dashboard .mm-detail-card input,#mediq-dashboard .mm-detail-card textarea,.mm-request-box input,.mm-request-box textarea{display:block;width:100%;box-sizing:border-box;border:1px solid #cfe3f0;border-radius:8px;padding:10px;font:inherit;margin-top:5px} #mediq-dashboard .mm-detail-line{display:flex;justify-content:space-between;gap:14px;padding:9px 0;border-bottom:1px solid #e4edf3} #mediq-dashboard .mm-detail-line span{color:#668399}#mediq-dashboard .mm-detail-line strong{overflow-wrap:anywhere} #mediq-dashboard .mm-user-menu{max-height:180px;overflow:auto;background:white;border:1px solid #c9dfea;position:relative;z-index:5}.mm-user-menu button{display:block;width:100%;padding:8px;text-align:right;background:#fff;border:0;cursor:pointer}.mm-user-menu button:hover{background:#eaf4fb} .mm-request-modal{position:fixed;inset:0;z-index:999999;display:flex;align-items:center;justify-content:center}.mm-request-backdrop{position:absolute;inset:0;background:#183c5d80}.mm-request-box{position:relative;width:min(850px,94vw);max-height:90vh;overflow:auto;background:white;border-radius:16px;padding:24px;box-sizing:border-box;box-shadow:0 14px 65px #1237}.mm-request-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.mm-request-grid label:last-child{grid-column:1/-1}.mm-comment{border-bottom:1px solid #dae7ef;padding:10px} @media(max-width:800px){#mediq-dashboard .mm-permanent-panel{width:min(92vw,410px);top:0}.mm-request-grid{grid-template-columns:1fr}} /* V38.15 - fixed dashboard column, compact modal and floating receipt calendar */ #mediq-dashboard #mmContent.mm-with-fixed-side{display:grid;grid-template-columns:minmax(0,1fr) 315px;gap:14px;align-items:start} #mediq-dashboard #mmContent.mm-with-fixed-side>.mm-permanent-panel{grid-column:2;grid-row:1/20;position:sticky;top:16px;left:auto;bottom:auto;width:auto;max-height:calc(100vh - 40px);z-index:2;box-shadow:none;border:1px solid #cee0ee;border-radius:14px;padding:14px;overflow:auto} #mediq-dashboard #mmContent.mm-with-fixed-side>:not(.mm-permanent-panel){grid-column:1;min-width:0} #mediq-dashboard .mm-receipt-date{position:relative} #mediq-dashboard .mm-receipt-date>.mm-cal{position:absolute!important;top:calc(100% + 5px)!important;right:0;left:auto!important;z-index:300;max-width:310px;width:310px;box-sizing:border-box} #mediq-dashboard .mm-receipt-date>.mm-cal[hidden]{display:none!important} .mm-request-box{width:min(850px,95vw);max-height:86vh;padding:20px 24px;font-size:14px;direction:rtl;text-align:right} .mm-request-box h3,.mm-request-box h4{margin:0 0 14px;color:#19577e} .mm-form-section{border:1px solid #d4e5f0;background:#fff;border-radius:12px;padding:16px;margin:15px 0} .mm-request-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px} .mm-request-grid .mm-wide{grid-column:1/-1} .mm-request-box label{margin:0;font-weight:600} .mm-request-box input,.mm-request-box select,.mm-request-box textarea{font:inherit;width:100%;border:1px solid #c9dfed;border-radius:8px;padding:10px;box-sizing:border-box;background:white;min-height:42px;margin-top:6px} .mm-readonly{background:#edf5fa;border-radius:8px;padding:12px;margin-top:6px} .mm-actions{display:flex;gap:9px;justify-content:flex-start;margin-top:12px} .mm-asset-button,.mm-related-ticket,.mm-doc-pill{display:block;text-align:right;background:#eff7fc;color:#135a83;border:1px solid #c7e2f2;padding:10px;border-radius:9px;margin:5px 0;cursor:pointer;width:100%;font:inherit} .mm-hint{color:#6a8190}.mm-doc-pill{display:inline-block;width:auto;text-decoration:none} @media(max-width:900px){#mediq-dashboard #mmContent.mm-with-fixed-side{grid-template-columns:minmax(0,1fr)}#mediq-dashboard #mmContent.mm-with-fixed-side>.mm-permanent-panel{position:relative;grid-row:auto;grid-column:1;top:auto;max-height:none}#mediq-dashboard #mmContent.mm-with-fixed-side>:not(.mm-permanent-panel){grid-column:1}.mm-request-grid{grid-template-columns:1fr}} </style> <style> #mediq-dashboard .mm-nav{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0} #mediq-dashboard #mmContent{min-height:350px;padding:20px} #mediq-dashboard #mmContent h3{font-size:14px;margin:18px 0 12px;color:#20577b} #mediq-dashboard #mmContent .v-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0} #mediq-dashboard #mmContent .v-fields label{display:flex;flex-direction:column;gap:6px;font-size:11px;font-weight:700} #mediq-dashboard #mmContent .v-fields input,#mediq-dashboard #mmContent .v-fields select,#mediq-dashboard #mmContent .v-fields textarea{padding:10px;border:1px solid #d5e7f2;border-radius:8px;background:white;min-width:0;width:100%;font:inherit} #mediq-dashboard #mmContent .mq-tbl-wrap{overflow:auto;max-height:490px} @media(max-width:850px){#mediq-dashboard #mmContent .v-fields{grid-template-columns:1fr}} /* Maintenance V37.4 */ #mediq-dashboard .mm-date-line{display:flex;gap:8px;align-items:center} #mediq-dashboard .mm-date-line input{flex:1;min-width:0;cursor:pointer} #mediq-dashboard .mm-cal{display:block;max-width:340px;padding:12px;background:#fff;border:1px solid #cadfec;border-radius:12px;margin-top:8px;box-shadow:0 12px 30px #17456520} #mediq-dashboard .mm-cal[hidden]{display:none!important} #mediq-dashboard .mm-cal-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:12px} #mediq-dashboard .mm-cal-head button{border:1px solid #cde1ed;background:#f1f7fc;border-radius:7px;padding:6px;color:#20577b;cursor:pointer} #mediq-dashboard .mm-cal-days{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:3px;text-align:center} #mediq-dashboard .mm-cal-days b{font-size:11px;color:#507890} #mediq-dashboard .mm-cal-days button{border:0;border-radius:7px;padding:6px 0;background:#eef6fb;color:#174565;cursor:pointer} #mediq-dashboard .mm-cal-days button:hover{background:#3997c8;color:#fff} #mediq-dashboard .mm-chart-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:15px;margin:15px 0} #mediq-dashboard .mm-chart-card{border:1px solid #d5e7f2;border-radius:14px;padding:20px;background:#fbfdff;display:flex;flex-direction:column;align-items:center;gap:15px} #mediq-dashboard .mm-donut{width:176px;height:176px;border-radius:50%;display:grid;place-items:center} #mediq-dashboard .mm-donut>div{width:120px;height:120px;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;flex-direction:column;font-size:25px;font-weight:800;color:#20577b} #mediq-dashboard .mm-donut small{font-size:11px;color:#7890a2} #mediq-dashboard .mm-chart-legend{display:flex;flex-wrap:wrap;gap:10px;justify-content:center} #mediq-dashboard .mm-chart-legend span{display:flex;gap:5px;align-items:center;font-size:11px} #mediq-dashboard .mm-chart-legend i{width:9px;height:9px;border-radius:50%;display:inline-block} /* V37.6: Floating Jalali picker and maintenance hierarchy. */ #mediq-dashboard .mm-cal{position:fixed!important;z-index:2147482000!important;max-width:none!important;margin:0!important;box-shadow:0 18px 52px rgba(20,56,81,.23)!important;direction:rtl;overflow-y:auto;max-height:calc(100vh - 16px)} #mediq-dashboard .mm-cal[hidden]{display:none!important} #mediq-dashboard .mm-date-line input{cursor:pointer!important;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%234c7793' stroke-width='1.7'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M7 3v4m10-4v4M3 10h18'/%3E%3C/svg%3E") no-repeat 12px center!important;padding-left:38px!important} #mediq-dashboard .mm-category-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;margin:14px 0} #mediq-dashboard .mm-category-card{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:11px;text-align:right;min-height:175px;padding:22px;border:1px solid #d2e4ef;border-radius:16px;background:#fff;color:#20577b;cursor:pointer;font-family:inherit;transition:transform .15s,box-shadow .15s} #mediq-dashboard .mm-category-card:hover{transform:translateY(-2px);box-shadow:0 14px 28px rgba(32,87,123,.10);border-color:#74b7d7} #mediq-dashboard .mm-category-icon{display:grid;place-items:center;width:52px;height:52px;background:#edf6fb;border-radius:12px;color:#467a9a} #mediq-dashboard .mm-category-icon svg{width:30px;height:30px} #mediq-dashboard .mm-category-card strong{font-size:14px} #mediq-dashboard .mm-category-card>span:not(.mm-category-icon){font-size:11px;color:#788e9c;line-height:1.8} #mediq-dashboard .mm-category-card i{position:absolute;left:16px;bottom:15px;font-style:normal;font-size:18px;color:#4d96b8} #mediq-dashboard .mm-subgrid{grid-template-columns:repeat(3,minmax(0,1fr))} #mediq-dashboard .mm-subgrid .mm-category-card{min-height:142px} #mediq-dashboard .mm-breadcrumb-nav{align-items:center}.mm-nav-separator{color:#8ca1b0;font-size:16px} #mediq-dashboard .mm-category-intro{font-size:12px;color:#6c8695} @media(max-width:900px){#mediq-dashboard .mm-category-grid{grid-template-columns:repeat(2,minmax(0,1fr))}} @media(max-width:580px){#mediq-dashboard .mm-category-grid{grid-template-columns:1fr}} /* MEDIQ V38 - UI only, existing palette */ #mediq-dashboard .mm-category-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px;margin:20px 0} #mediq-dashboard .mm-category-card{min-height:178px;font-size:15px;box-shadow:0 6px 20px rgba(29,82,115,.06)} #mediq-dashboard .mm-category-card strong{font-size:17px} #mediq-dashboard #mmContent,#mediq-dashboard #mmContent h3{font-size:15px} #mediq-dashboard #mmContent .v-fields label{font-size:13px} #mediq-dashboard #mmContent input,#mediq-dashboard #mmContent select,#mediq-dashboard #mmContent textarea{font-size:14px} #mediq-dashboard .mm-actionbar{display:flex;gap:10px;flex-wrap:wrap;margin:12px 0;align-items:center} #mediq-dashboard .mm-actionbar input,#mediq-dashboard .mm-actionbar select{border:1px solid #cfe2ed;border-radius:9px;padding:11px;min-width:145px;background:white;color:#234b66;max-width:100%} #mediq-dashboard .mm-two-pane{display:grid;grid-template-columns:minmax(0,1fr) 240px;gap:16px;align-items:start} #mediq-dashboard .mm-sidebar{grid-column:2;grid-row:1;border:1px solid #cfe2ed;background:#fff;border-radius:13px;padding:15px;position:sticky;top:12px} #mediq-dashboard .mm-sidebar button{display:block;width:100%;text-align:right;border:0;background:transparent;color:#225b7f;padding:12px 8px;cursor:pointer;border-radius:8px;font:inherit;font-weight:700} #mediq-dashboard .mm-sidebar button:hover{background:#eff7fc} #mediq-dashboard .mm-main{grid-column:1;grid-row:1;min-width:0} #mediq-dashboard .mm-plan-form .v-fields{grid-template-columns:repeat(4,minmax(0,1fr))!important} #mediq-dashboard .mm-priority-high{color:#b54831;font-weight:800} #mediq-dashboard .mm-priority-normal{color:#1f7092} #mediq-dashboard .mm-stats-block{margin-bottom:18px} #mediq-dashboard .mm-table-panel{max-width:100%;overflow-x:auto} @media(max-width:1050px){#mediq-dashboard .mm-plan-form .v-fields{grid-template-columns:repeat(2,minmax(0,1fr))!important}} @media(max-width:800px){#mediq-dashboard .mm-two-pane{display:block}#mediq-dashboard .mm-sidebar{position:static;margin-bottom:12px}#mediq-dashboard .mm-sidebar button{display:inline-block;width:auto}#mediq-dashboard .mm-category-grid{grid-template-columns:repeat(2,minmax(0,1fr))}} @media(max-width:550px){#mediq-dashboard .mm-category-grid{grid-template-columns:1fr}#mediq-dashboard .mm-plan-form .v-fields{grid-template-columns:1fr!important}#mediq-dashboard .mm-actionbar input,#mediq-dashboard .mm-actionbar select{width:100%}} /* V38.4 - Five actual maintenance landing cards */ #mediq-dashboard .mm-card-home{direction:rtl;text-align:right;padding:10px 2px 24px} #mediq-dashboard .mm-card-home h2{font-size:19px;font-weight:800;color:#225b7f;margin:5px 0 20px} #mediq-dashboard .mm-card-home .mm-category-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:18px} #mediq-dashboard .mm-card-home .mm-category-card{align-items:flex-start;text-align:right;min-height:188px;border-radius:17px} #mediq-dashboard .mm-crumb{background:transparent;border:0;color:#225b7f;font:inherit;cursor:pointer;padding:5px 2px} #mediq-dashboard .mm-crumb:hover{text-decoration:underline} @media(max-width:900px){#mediq-dashboard .mm-card-home .mm-category-grid{grid-template-columns:repeat(2,minmax(0,1fr))}} @media(max-width:560px){#mediq-dashboard .mm-card-home .mm-category-grid{grid-template-columns:1fr}} /* MEDIQ V38.3 - top-level maintenance navigation */ #mediq-dashboard .mm-route-nav{display:flex;direction:rtl;align-items:center;justify-content:flex-start;gap:10px;flex-wrap:wrap;margin:13px 0 17px;color:#54758d;font-size:13px;font-weight:600} #mediq-dashboard .mm-route-nav strong{color:#1d628b;font-weight:800} #mediq-dashboard .mm-route-separator{opacity:.55;font-size:19px} #mediq-dashboard .mm-top-tabs{display:flex;direction:rtl;gap:8px;flex-wrap:wrap;align-items:center;margin:0 0 14px;border-bottom:1px solid #cfe2ed;padding-bottom:10px} #mediq-dashboard .mm-top-tab{appearance:none;border:1px solid #cfe2ed;border-radius:10px;background:#fff;color:#225b7f;padding:12px 19px;font:inherit;font-size:14px;font-weight:700;cursor:pointer;transition:background .15s,border-color .15s} #mediq-dashboard .mm-top-tab.active{background:#348fbe;border-color:#348fbe;color:#fff} #mediq-dashboard .mm-top-tab:focus-visible{outline:2px solid #167cac;outline-offset:2px} #mediq-dashboard .mm-top-tab:not(.active):hover{background:#eef7fc} @media(max-width:550px){#mediq-dashboard .mm-top-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}#mediq-dashboard .mm-top-tab{padding:12px 8px;font-size:12px}} /* MEDIQ V38.2 scoped improvements */ #mediq-dashboard .mm-full-width{display:block!important} #mediq-dashboard .mm-full-width .mm-main{width:100%} #mediq-dashboard #mmContent{text-align:right;direction:rtl} #mediq-dashboard #mmContent .v-fields{direction:rtl} #mediq-dashboard .mm-tree-children{display:none;direction:rtl;padding:4px 14px 8px 4px} #mediq-dashboard .mm-tree-children.open{display:block} #mediq-dashboard .mm-tree-children button{display:block;width:100%;border:0;background:transparent;color:#eaf5ff;text-align:right;padding:11px 12px;font:inherit;cursor:pointer;border-radius:8px} #mediq-dashboard .mm-tree-children button.active,#mediq-dashboard .mm-tree-children button:hover{background:rgba(255,255,255,.16);font-weight:700} #mediq-dashboard .mm-tree-arrow{margin-right:auto;padding:0 4px} #mediq-dashboard .mm-issue-link{background:none;border:0;color:#0872ba;cursor:pointer;font:inherit;font-weight:700} #mediq-dashboard .mm-issue-overlay{position:fixed;inset:0;z-index:99999} #mediq-dashboard .mm-issue-scrim{position:absolute;inset:0;background:rgba(22,52,75,.34)} #mediq-dashboard .mm-issue-drawer{position:absolute;top:0;left:0;height:100%;width:min(480px,94vw);background:#fff;box-shadow:8px 0 30px rgba(20,50,80,.18);overflow:auto;padding:22px;color:#1f4f6b;text-align:right} #mediq-dashboard .mm-issue-top{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #dce9f3;padding-bottom:14px} #mediq-dashboard .mm-issue-top button{border:0;background:#eaf4fa;border-radius:8px;font-size:24px;cursor:pointer} #mediq-dashboard .mm-issue-drawer dl{display:grid;grid-template-columns:120px 1fr;gap:14px;border-top:1px solid #e0edf3;padding-top:15px} #mediq-dashboard .mm-issue-drawer dt{color:#6b879b}#mediq-dashboard .mm-issue-drawer dd{margin:0} #mediq-dashboard .mm-cal button[disabled]{opacity:.28;pointer-events:none;cursor:not-allowed} #mediq-dashboard #mm_targetSearch{margin-bottom:5px} @media(max-width:600px){#mediq-dashboard .mm-tree-children button{padding:10px}#mediq-dashboard .mm-issue-drawer{width:96vw}} </style> <style> #mediq-dashboard .mq-list-controls{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px;margin:14px 0;font-size:12px} #mediq-dashboard .mq-list-controls select{border:1px solid #cce2f0;border-radius:8px;padding:7px 12px;background:white;color:#315873} #mediq-dashboard .mq-assets-btn:disabled{opacity:.4;cursor:default} #mediq-dashboard .mq-jcalendar{padding:12px;border:1px solid #cce2f0;border-radius:10px;background:#fff;margin-top:7px;max-width:340px} #mediq-dashboard .mq-jcalendar[hidden]{display:none!important} #mediq-dashboard .mq-jcal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;text-align:center;margin:10px 0} #mediq-dashboard .mq-jcal-head{display:flex;justify-content:space-between;align-items:center;gap:8px} #mediq-dashboard .mq-jcalendar button{border:1px solid #d5e7f2;border-radius:6px;padding:5px;background:#f1f8fd;color:#315873;cursor:pointer;font:inherit} #mediq-dashboard .mq-jcalendar button:hover{background:#e0f0fa} /* ============================================================ MEDIQ DASHBOARD - SUPPLY PRESENTATION VERSION ============================================================ */ #mediq-dashboard, #mediq-dashboard * { box-sizing: border-box; } #mediq-dashboard { --navy: #20577b; --navy-dark: #174565; --primary: #3997c8; --primary-dark: #277eaf; --text: #24475f; --muted: #7c99ae; --border: #d5e7f2; --bg: #f1f7fc; --white: #ffffff; position: fixed; inset: 0; width: 100vw; height: 100vh; z-index: 9999; overflow: hidden; direction: rtl; font-family: Tahoma, Arial, sans-serif; color: var(--text); background: radial-gradient( circle at 12% 4%, rgba(57,151,200,.09), transparent 27% ), #f1f7fc; } /* ============================================================ HIDE CONFLUENCE ============================================================ */ html, body, #page, #full-height-container, #main, #content, #main-content, .aui-page-panel, .aui-page-panel-inner, .aui-page-panel-content, .content-body { width: 100% !important; height: 100% !important; max-width: none !important; margin: 0 !important; padding: 0 !important; } html, body { overflow: hidden !important; } #footer, footer, .aui-footer, #header, #main-header, .breadcrumbs, #breadcrumbs, .page-metadata { display: none !important; } /* ============================================================ APP ============================================================ */ .mq-app { width: 100%; height: 100%; display: grid; grid-template-columns: minmax(0,1fr) 255px; direction: ltr; } /* ============================================================ SIDEBAR - LEAD GRAY THEME ============================================================ */ .mq-sidebar { grid-column: 2; height: 100vh; padding: 24px 17px; direction: rtl; color: #fff; display: flex; flex-direction: column; background: linear-gradient( 180deg, #4b9dca 0%, #337fae 45%, #23658f 100% ); box-shadow: -12px 0 38px rgba(43,49,56,.18); border-left: 1px solid rgba(255,255,255,.04); } /* LOGO */ .mq-logo { width: 100%; text-align: center; padding: 3px 5px 22px; border-bottom: 1px solid rgba(255,255,255,.08); } .mq-logo img { width: 174px; max-width: 92%; height: auto; filter: drop-shadow(0 2px 10px rgba(0,0,0,.08)); } /* USER */ .mq-user { margin-top: 17px; padding: 14px 15px; border-radius: 14px; background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.08); box-shadow: inset 0 1px 0 rgba(255,255,255,.04); } .mq-user-name { font-size: 12px; font-weight: 900; color: #ffffff; } .mq-user-role { margin-top: 6px; color: rgba(255,255,255,.64); font-size: 9px; font-weight: 600; } /* ============================================================ LIFE CYCLE ============================================================ */ .mq-life-title { margin: 26px 7px 9px; color: rgba(255,255,255,.42); font-size: 9px; font-weight: 700; letter-spacing: .2px; } .mq-life { display: flex; flex-direction: column; gap: 7px; } .mq-life-item { position: relative; min-height: 46px; padding: 0 13px; border-radius: 12px; display: flex; align-items: center; gap: 10px; color: rgba(255,255,255,.76); font-size: 11px; font-weight: 800; cursor: pointer; user-select: none; border: 1px solid transparent; transition: background .18s ease, color .18s ease, transform .18s ease, border-color .18s ease, box-shadow .18s ease; } .mq-life-item:hover { color: #fff; background: rgba(255,255,255,.08); border-color: rgba(255,255,255,.07); } .mq-life-item.active { color: #ffffff; background: linear-gradient( 90deg, #3997c8 0%, #2e85b5 100% ); border-color: rgba(255,255,255,.10); box-shadow: 0 12px 24px rgba(35,40,46,.24); } .mq-life-item.active::before { content: ""; position: absolute; right: 10px; top: 50%; width: 6px; height: 6px; border-radius: 50%; background: #ffffff; transform: translateY(-50%); box-shadow: 0 0 0 4px rgba(255,255,255,.10); } .mq-life-icon { width: 28px; height: 28px; border-radius: 8px; display: flex; align-items: center; justify-content: center; background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.05); } .mq-life-item.active .mq-life-icon { background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.10); } .mq-life-icon svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round; } /* ============================================================ LOGOUT ============================================================ */ .mq-sidebar-bottom { margin-top: auto; padding-top: 14px; border-top: 1px solid rgba(255,255,255,.07); } .mq-logout { min-height: 43px; padding: 0 13px; border-radius: 11px; display: flex; align-items: center; gap: 9px; color: rgba(255,255,255,.72); font-size: 10px; font-weight: 700; cursor: pointer; border: 1px solid transparent; transition: background .18s ease, color .18s ease, border-color .18s ease; } .mq-logout:hover { color: #fff; background: rgba(255,255,255,.07); border-color: rgba(255,255,255,.07); } /* ============================================================ MAIN ============================================================ */ .mq-main { grid-column: 1; height: 100vh; direction: rtl; overflow-y: auto; padding: 0 clamp(25px,4vw,55px) 45px; } /* ============================================================ HEADER ============================================================ */ .mq-header { min-height: 88px; border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; gap: 20px; } .mq-header-right { min-width: 0; } .mq-page-title { color: var(--navy); font-size: 20px; font-weight: 900; } .mq-page-description { margin-top: 6px; color: var(--muted); font-size: 10px; font-weight: 600; } /* CENTER */ .mq-center { padding: 10px 14px; border: 1px solid var(--border); border-radius: 11px; background: #fff; color: #536f84; font-size: 10px; font-weight: 700; } /* ============================================================ BREADCRUMB ============================================================ */ .mq-breadcrumb { min-height: 54px; display: flex; align-items: center; gap: 7px; flex-wrap: wrap; } .mq-bread-item { color: #8197a8; font-size: 10px; font-weight: 700; } .mq-bread-current { color: var(--primary-dark); font-weight: 900; } .mq-bread-separator { color: #b6c4cf; } /* ============================================================ HERO ============================================================ */ .mq-hero { position: relative; overflow: hidden; min-height: 112px; padding: 21px 24px; border-radius: 18px; color: #fff; display: flex; align-items: center; justify-content: space-between; background: linear-gradient( 105deg, #24475f, #277eaf ); box-shadow: 0 15px 35px rgba(7,53,83,.10); } .mq-hero::before { content: ""; position: absolute; width: 250px; height: 250px; left: -70px; top: -150px; border-radius: 50%; background: rgba(107,119,131,.14); } .mq-hero-title { position: relative; z-index: 2; font-size: 16px; font-weight: 900; } .mq-hero-desc { position: relative; z-index: 2; margin-top: 6px; color: rgba(255,255,255,.70); font-size: 10px; } .mq-back-btn { position: relative; z-index: 2; display: none; min-width: 88px; height: 36px; padding: 0 13px; border: 1px solid rgba(255,255,255,.25); border-radius: 10px; background: rgba(255,255,255,.10); color: #fff; font-family: inherit; font-size: 10px; font-weight: 800; cursor: pointer; } .mq-back-btn:hover { background: rgba(255,255,255,.16); } /* ============================================================ CONTENT ============================================================ */ .mq-view { margin-top: 23px; animation: mqFade .22s ease; } @keyframes mqFade { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: translateY(0); } } /* ============================================================ SECTION HEADER ============================================================ */ .mq-section-head { margin-bottom: 14px; display: flex; align-items: center; justify-content: space-between; } .mq-section-title { color: var(--navy); font-size: 14px; font-weight: 900; } .mq-section-desc { margin-top: 4px; color: var(--muted); font-size: 9px; } /* ============================================================ MODULE CARDS ============================================================ */ .mq-card-grid { display: grid; grid-template-columns: repeat(4,minmax(0,1fr)); gap: 14px; } .mq-module-card { position: relative; min-height: 176px; padding: 18px; border: 1px solid var(--border); border-radius: 17px; background: #fff; cursor: pointer; box-shadow: 0 9px 26px rgba(19,65,90,.035); transition: transform .17s ease, box-shadow .17s ease, border-color .17s ease; } .mq-module-card:hover { transform: translateY(-4px); border-color: rgba(87,96,106,.45); box-shadow: 0 18px 40px rgba(19,65,90,.08); } .mq-module-icon { width: 48px; height: 48px; margin-bottom: 17px; border-radius: 14px; display: flex; align-items: center; justify-content: center; color: var(--primary-dark); background: linear-gradient( 145deg, #eaf4fb, #e0f0fa ); } .mq-module-icon svg { width: 24px; height: 24px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; } .mq-module-name { color: var(--navy); font-size: 12px; font-weight: 900; line-height: 1.8; } .mq-module-arrow { position: absolute; left: 18px; bottom: 17px; width: 29px; height: 29px; border-radius: 8px; display: flex; align-items: center; justify-content: center; color: #8ea5b5; background: #f3f7f9; font-size: 18px; } .mq-module-card:hover .mq-module-arrow { color: #fff; background: var(--primary); } /* ============================================================ LARGE ACTION CARDS ============================================================ */ .mq-action-grid { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 15px; } .mq-action-card { min-height: 155px; padding: 19px; border: 1px solid var(--border); border-radius: 17px; background: #fff; cursor: pointer; display: flex; align-items: center; gap: 16px; transition: .17s; } .mq-action-card:hover { border-color: rgba(87,96,106,.45); transform: translateY(-2px); box-shadow: 0 15px 35px rgba(24,74,98,.06); } .mq-action-icon { flex: 0 0 auto; width: 54px; height: 54px; border-radius: 15px; display: flex; align-items: center; justify-content: center; color: var(--primary-dark); background: #f0f7fc; } .mq-action-icon svg { width: 25px; height: 25px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; } .mq-action-title { color: var(--navy); font-size: 13px; font-weight: 900; } .mq-action-sub { margin-top: 6px; color: var(--muted); font-size: 9px; } /* ============================================================ ASSET LIST MENU ============================================================ */ .mq-list-layout { display: grid; grid-template-columns: 330px minmax(0,1fr); gap: 16px; direction: ltr; } .mq-list-menu, .mq-preview { direction: rtl; border: 1px solid var(--border); border-radius: 18px; background: #fff; box-shadow: 0 10px 28px rgba(19,65,90,.035); } .mq-list-menu { padding: 13px; } .mq-list-option { min-height: 52px; margin-bottom: 5px; padding: 0 13px; border-radius: 10px; display: flex; align-items: center; justify-content: space-between; color: #536f84; font-size: 10px; font-weight: 800; cursor: pointer; transition: .15s; } .mq-list-option:hover { color: var(--primary-dark); background: #f3f9fd; } .mq-list-option.active { color: #2b5672; background: #eaf4fc; } .mq-option-badge { width: 26px; height: 26px; border-radius: 7px; display: flex; align-items: center; justify-content: center; background: rgba(87,96,106,.09); color: var(--primary-dark); } /* ============================================================ PREVIEW ============================================================ */ .mq-preview { min-height: 390px; padding: 23px; } .mq-preview-title { color: var(--navy); font-size: 14px; font-weight: 900; } .mq-preview-description { margin-top: 7px; color: var(--muted); font-size: 9px; } /* MOCK CONTENT */ .mq-demo-box { margin-top: 23px; padding: 20px; border: 1px dashed #bdd4df; border-radius: 14px; background: #f8fbfc; } .mq-demo-icon { width: 48px; height: 48px; margin: 0 auto 12px; border-radius: 14px; display: flex; align-items: center; justify-content: center; color: var(--primary-dark); background: #eaf4fc; } .mq-demo-text { color: #4d84a8; text-align: center; font-size: 10px; line-height: 2; } .mq-demo-button { display: block; min-width: 125px; height: 38px; margin: 17px auto 0; border: 0; border-radius: 9px; background: linear-gradient( 90deg, #409fd1, #2c88bb ); color: #fff; font-family: inherit; font-size: 10px; font-weight: 800; cursor: pointer; } /* ============================================================ PLACEHOLDER LIFE CYCLE ============================================================ */ .mq-empty-cycle { min-height: 350px; border: 1px dashed #c7dce5; border-radius: 18px; display: flex; align-items: center; justify-content: center; flex-direction: column; background: rgba(255,255,255,.65); color: #7890a2; } .mq-empty-cycle strong { color: var(--navy); font-size: 15px; } .mq-empty-cycle span { margin-top: 8px; font-size: 10px; } /* ============================================================ TOAST ============================================================ */ .mq-toast { position: fixed; left: 30px; bottom: 27px; z-index: 10020; min-width: 260px; max-width: 360px; padding: 13px 16px; border-radius: 11px; color: #fff; background: #073b5c; box-shadow: 0 16px 40px rgba(0,0,0,.15); font-size: 10px; font-weight: 700; opacity: 0; transform: translateY(12px); pointer-events: none; transition: .2s; } .mq-toast.show { opacity: 1; transform: translateY(0); } /* ============================================================ RESPONSIVE ============================================================ */ @media(max-width:1300px) { .mq-card-grid { grid-template-columns: repeat(2,minmax(0,1fr)); } } @media(max-width:1000px) { .mq-app { grid-template-columns: minmax(0,1fr) 210px; } .mq-list-layout { grid-template-columns: 280px minmax(0,1fr); } } @media(max-width:800px) { .mq-sidebar { display: none; } .mq-app { display: block; } .mq-main { width: 100%; } .mq-card-grid, .mq-action-grid, .mq-list-layout { grid-template-columns: 1fr; } } /* ============================================================ MEDIQ SIDEBAR NAVIGATION TREE ============================================================ */ .mq-life-title, .mq-life { display: none !important; } .mq-tree-title { margin: 22px 7px 9px; color: rgba(255,255,255,.39); font-size: 9px; font-weight: 700; } .mq-tree { display: flex; flex-direction: column; gap: 5px; overflow-y: auto; overflow-x: hidden; padding-left: 2px; scrollbar-width: thin; } .mq-tree::-webkit-scrollbar { width: 4px; } .mq-tree::-webkit-scrollbar-thumb { background: rgba(255,255,255,.15); border-radius: 10px; } .mq-tree-row { min-height: 38px; padding: 0 10px; border-radius: 9px; display: flex; align-items: center; gap: 8px; color: rgba(255,255,255,.70); font-size: 10px; font-weight: 800; cursor: pointer; user-select: none; transition: background .15s ease, color .15s ease; } .mq-tree-row:hover { color: #fff; background: rgba(255,255,255,.07); } .mq-tree-row.active { color: #fff; background: linear-gradient(90deg,#3997c8,#277eaf); } .mq-tree-row.parent-active:not(.active) { color: #fff; background: rgba(255,255,255,.055); } .mq-tree-row.level-1 { padding-right: 10px; } .mq-tree-row.level-2 { padding-right: 23px; font-size: 9.5px; } .mq-tree-row.level-3 { padding-right: 36px; font-size: 9px; } .mq-tree-row.level-4 { padding-right: 49px; font-size: 8.7px; color: rgba(255,255,255,.60); } .mq-tree-dot { width: 6px; height: 6px; flex: 0 0 6px; border-radius: 50%; background: rgba(255,255,255,.32); } .mq-tree-row.active .mq-tree-dot { background: #fff; } .mq-tree-arrow { margin-right: auto; color: rgba(255,255,255,.45); font-size: 13px; transition: transform .18s ease; } .mq-tree-row.open > .mq-tree-arrow { transform: rotate(90deg); } .mq-tree-children { display: none; margin-top: 2px; } .mq-tree-children.open { display: block; } .mq-tree-separator { height: 1px; margin: 8px 9px; background: rgba(255,255,255,.08); } /* ============================================================ MEDIQ UI POLISH - LARGER TYPOGRAPHY + TOP WELCOME ============================================================ */ #mediq-dashboard .mq-user-name { font-size: 15px; } #mediq-dashboard .mq-user-role { font-size: 12px; } #mediq-dashboard .mq-tree-title { font-size: 12px; } #mediq-dashboard .mq-tree-row { font-size: 13px; min-height: 42px; } #mediq-dashboard .mq-tree-row.level-2 { font-size: 12.5px; } #mediq-dashboard .mq-tree-row.level-3 { font-size: 12px; } #mediq-dashboard .mq-tree-row.level-4 { font-size: 11.7px; } #mediq-dashboard .mq-logout { font-size: 13px; } #mediq-dashboard .mq-page-title { font-size: 23px; } #mediq-dashboard .mq-page-description { font-size: 13px; } #mediq-dashboard .mq-center { font-size: 13px; } #mediq-dashboard .mq-bread-item { font-size: 13px; } #mediq-dashboard .mq-hero-title { font-size: 19px; } #mediq-dashboard .mq-hero-desc { font-size: 13px; } #mediq-dashboard .mq-back-btn { font-size: 13px; } #mediq-dashboard .mq-section-title { font-size: 17px; } #mediq-dashboard .mq-section-desc { font-size: 12px; } #mediq-dashboard .mq-module-name { font-size: 15px; } #mediq-dashboard .mq-action-title { font-size: 16px; } #mediq-dashboard .mq-action-sub { font-size: 12px; } #mediq-dashboard .mq-list-option { font-size: 13px; } #mediq-dashboard .mq-preview-title { font-size: 17px; } #mediq-dashboard .mq-preview-description, #mediq-dashboard .mq-demo-text { font-size: 12px; } #mediq-dashboard .mq-demo-button { font-size: 13px; } #mediq-dashboard .mq-empty-cycle strong { font-size: 18px; } #mediq-dashboard .mq-empty-cycle span { font-size: 13px; } #mediq-dashboard .mq-toast { font-size: 13px; } #mediq-dashboard .mq-header-welcome { display:flex; align-items:center; gap:9px; padding:9px 14px; border:1px solid rgba(87,96,106,.20); border-radius:999px; background:rgba(255,255,255,.82); box-shadow:0 7px 22px rgba(7,53,83,.055); color:#587287; font-size:13px; font-weight:700; white-space:nowrap; } #mediq-dashboard .mq-header-welcome strong { color:var(--navy); font-size:14px; font-weight:900; } #mediq-dashboard .mq-welcome-dot { width:8px; height:8px; border-radius:50%; background:var(--primary); box-shadow:0 0 0 4px rgba(87,96,106,.10); } #mediq-dashboard .mq-header-left { display:flex; align-items:center; gap:10px; } #mediq-dashboard .mq-edit-page-btn{ display:inline-flex; align-items:center; justify-content:center; gap:7px; min-height:38px; padding:0 14px; border:1px solid #cfe1e8; border-radius:12px; background:#fff; color:#34414d !important; font-family:inherit; font-size:12px; font-weight:900; text-decoration:none !important; cursor:pointer; box-shadow:0 6px 18px rgba(3,53,83,.06); transition:.18s ease; } #mediq-dashboard .mq-edit-page-btn:hover{ background:#eaf4fb; border-color:#b8bec5; color:#326588 !important; transform:translateY(-1px); } #mediq-dashboard .mq-edit-page-btn svg{ width:15px; height:15px; stroke:currentColor; stroke-width:2; fill:none; } #mediq-dashboard .mq-module-card { box-shadow:0 10px 30px rgba(19,65,90,.05); } #mediq-dashboard .mq-module-card:hover { transform:translateY(-5px); box-shadow:0 20px 45px rgba(19,65,90,.10); } #mediq-dashboard .mq-hero { box-shadow:0 18px 42px rgba(7,53,83,.12); } /* ===== FINAL UI REFINEMENTS ===== */ #mediq-dashboard .mq-header { min-height: 92px; } #mediq-dashboard .mq-header-left { margin-right:auto; } #mediq-dashboard .mq-header-welcome { padding:10px 16px; } #mediq-dashboard .mq-breadcrumb { min-height:46px; } #mediq-dashboard .mq-hero { margin-top:14px; } #mediq-dashboard .mq-tree { scrollbar-width:none; -ms-overflow-style:none; } #mediq-dashboard .mq-tree::-webkit-scrollbar { display:none !important; width:0 !important; } #mediq-dashboard .mq-sidebar { overflow:hidden; } #mediq-dashboard .mq-bread-link { cursor: pointer; transition: color .15s ease, background .15s ease; border-radius: 7px; padding: 4px 6px; } #mediq-dashboard .mq-bread-link:hover { color: var(--primary) !important; background: rgba(87,96,106,.08); } /* MEDIQ - REAL PURCHASED ASSETS LIST (table) ============================================================ */ #mediq-dashboard .mq-assets-head { margin-top: 18px; display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; } #mediq-dashboard .mq-assets-actions { display: flex; gap: 8px; flex-wrap: wrap; } #mediq-dashboard .mq-assets-btn { min-height: 38px; padding: 0 15px; border: 1px solid #d8e7ed; border-radius: 9px; background: #fff; color: #47677d; font-family: inherit; font-size: 12px; font-weight: 800; cursor: pointer; } #mediq-dashboard .mq-assets-btn.primary { border-color: transparent; color: #fff; background: linear-gradient(90deg,#409fd1,#2c88bb); } #mediq-dashboard .mq-assets-host { margin-top: 14px; min-height: 140px; } #mediq-dashboard .mq-assets-host > table, #mediq-dashboard .mq-assets-host table { width: 100% !important; border-collapse: collapse !important; direction: rtl !important; background: #fff !important; border: 1px solid #d7dde2 !important; border-radius: 12px !important; overflow: hidden !important; } #mediq-dashboard .mq-assets-host th { padding: 12px 14px !important; text-align: right !important; background: #f5f9fd !important; color: #47677d !important; border-bottom: 1px solid #d7dde2 !important; font-size: 12px !important; font-weight: 900 !important; } #mediq-dashboard .mq-assets-host td { padding: 12px 14px !important; text-align: right !important; color: #294e68 !important; border-bottom: 1px solid #e5f0f9 !important; font-size: 12px !important; font-weight: 700 !important; } #mediq-dashboard .mq-assets-message { min-height: 140px; display: flex; align-items: center; justify-content: center; padding: 22px; border: 1px dashed #c5dce5; border-radius: 12px; background: #f8fbfc; color: #6f8799; text-align: center; font-size: 12px; font-weight: 700; } #mediq-dashboard .mq-cf-delete-proxy { display: inline-flex !important; align-items: center; justify-content: center; min-width: 58px; min-height: 30px; padding: 0 10px !important; border: 1px solid #f1c9c9 !important; border-radius: 8px !important; background: #fff7f7 !important; color: #b42318 !important; text-decoration: none !important; font-family: inherit !important; font-size: 11px !important; font-weight: 800 !important; cursor: pointer !important; } #mediq-dashboard .mq-cf-delete-proxy:hover { background: #ffeded !important; border-color: #e8aaaa !important; } #mediq-dashboard .mq-cf-edit-proxy { min-width: 50px !important; height: 28px !important; padding: 0 11px !important; margin-left: 6px !important; border: 1px solid rgba(87,96,106,.30) !important; border-radius: 8px !important; background: #f4f4f5 !important; color: #434a51 !important; font-family: inherit !important; font-size: 11px !important; font-weight: 800 !important; cursor: pointer !important; text-decoration: none !important; } #mediq-dashboard .mq-cf-edit-proxy:hover { background: #eaebec !important; border-color: rgba(87,96,106,.55) !important; } /* ============================================================ DEDICATED EDIT ASSET WORKSPACE ============================================================ */ #mediq-dashboard .mq-edit-wrap { border: 1px solid var(--border); border-radius: 18px; background: #fff; padding: 24px; box-shadow: 0 10px 28px rgba(19,65,90,.035); } #mediq-dashboard .mq-edit-toolbar { margin-top: 18px; display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; } #mediq-dashboard .mq-edit-search { width: min(390px, 100%); min-height: 40px; padding: 0 14px; border: 1px solid #d8e7ed; border-radius: 10px; outline: none; background: #fff; color: #294e68; direction: rtl; font-family: inherit; font-size: 12px; font-weight: 700; } #mediq-dashboard .mq-edit-search:focus { border-color: rgba(87,96,106,.65); box-shadow: 0 0 0 3px rgba(87,96,106,.08); } #mediq-dashboard .mq-edit-help { color: #71899a; font-size: 12px; font-weight: 700; } #mediq-dashboard .mq-edit-host { margin-top: 14px; } #mediq-dashboard .mq-edit-host table { width: 100% !important; border-collapse: collapse !important; direction: rtl !important; background: #fff !important; border: 1px solid #d7dde2 !important; } #mediq-dashboard .mq-edit-host th { padding: 12px 14px !important; text-align: right !important; background: #f5f9fd !important; color: #47677d !important; border-bottom: 1px solid #d7dde2 !important; font-size: 12px !important; font-weight: 900 !important; } #mediq-dashboard .mq-edit-host td { padding: 12px 14px !important; text-align: right !important; color: #294e68 !important; border-bottom: 1px solid #e5f0f9 !important; font-size: 12px !important; font-weight: 700 !important; } #mediq-dashboard{ --navy:#347da8 !important; --navy-dark:#215b83 !important; --primary:#3997c8 !important; --primary-dark:#277eaf !important; --text:#315873 !important; --muted:#7e9bae !important; --border:#d5e7f2 !important; --bg:#f1f7fc !important; } #mediq-dashboard{background:#f1f7fc !important;} #mediq-dashboard .mq-sidebar{ background:linear-gradient(180deg,#58a4cf 0%,#3d89b7 52%,#23658f 100%) !important; box-shadow:-12px 0 42px rgba(27,32,42,.18) !important; } #mediq-dashboard .mq-life-item.active{ background:linear-gradient(90deg,#409fd1,#2c88bb) !important; box-shadow:0 10px 24px rgba(39,126,175,.22) !important; } #mediq-dashboard .mq-hero{ background:linear-gradient(105deg,#388cbc 0%,#64b2db 62%,#3997c8 135%) !important; box-shadow:0 16px 40px rgba(38,44,58,.14) !important; } #mediq-dashboard .mq-hero::before{background:rgba(169,218,246,.13) !important;} #mediq-dashboard .mq-welcome-dot{background:#3997c8 !important;box-shadow:0 0 0 4px rgba(64,159,209,.12) !important;} #mediq-dashboard .mq-action-card:hover, #mediq-dashboard .mq-card:hover{ border-color:#a5d1eb !important; box-shadow:0 16px 34px rgba(39,126,175,.09) !important; } #mediq-dashboard .mq-edit-page-btn:hover{ border-color:#a5d1eb !important; color:#277eaf !important; } /* ===== MediQ code-only wizard (standalone) ===== */ #mqWz,#mqDetail{position:fixed;inset:0;z-index:11000;display:none;align-items:center;justify-content:center;padding:18px;background:rgba(28,33,43,.58);backdrop-filter:blur(4px);direction:rtl} #mqWz.open,#mqDetail.open{display:flex} #mqWz *,#mqDetail *{box-sizing:border-box;font-family:Tahoma,Arial,sans-serif} .wz-dialog{width:min(820px,94vw);max-height:90vh;display:flex;flex-direction:column;background:#fff;border:1px solid #d5e7f2;border-radius:20px;box-shadow:0 28px 90px rgba(22,27,38,.34);overflow:hidden;color:#24475f} .wz-head{padding:18px 22px 14px;border-bottom:1px solid #e5e7ef;flex:0 0 auto} .wz-head-top{display:flex;align-items:center;justify-content:space-between;gap:14px} .wz-title{font-size:18px;font-weight:900;color:#204969} .wz-close{width:36px;height:36px;border:0;border-radius:10px;background:#f2f4f8;color:#6d91ab;font:700 21px/36px Tahoma;cursor:pointer} .wz-close:hover{background:#e5f0f9;color:#277eaf} .wz-steps{margin-top:14px;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px} .wz-step{min-height:40px;padding:7px 9px;display:flex;align-items:center;justify-content:center;gap:7px;border:1px solid #e2e6ee;border-radius:10px;background:#f5f9fd;color:#91aabd;font-size:11px;font-weight:800} .wz-step b{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;background:#e3eff8;color:#6d91ab;font-size:10px} .wz-step.active{border-color:#3997c8;background:#3997c8;color:#fff} .wz-step.active span{color:#fff} .wz-step.active b{background:#3997c8;color:#fff} .wz-step.done{background:#edf6fc;color:#4f86aa} .wz-body{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;padding:20px 22px 14px} .wz-label{margin:0 2px 8px;font-size:12px;font-weight:900;color:#355e79} .wz-selected{margin:0 0 10px;padding:9px 12px;border:1px dashed #cce2f0;border-radius:10px;background:#f5f9fd;color:#819eaf;font-size:12px;font-weight:800} .wz-selected.has{border-style:solid;color:#2b5672;background:#e7f2fb} .wz-picker{border:1px solid #cce2f0;border-radius:12px;overflow:hidden;background:#fff} .wz-search{display:block;width:100%;height:42px;padding:0 13px;border:0;border-bottom:1px solid #e4e7e9;background:#f1f8fd;font-size:12px;color:#2b5672;outline:none;direction:rtl} .wz-list{max-height:230px;overflow-y:auto;padding:6px} .wz-item{display:block;width:100%;min-height:38px;padding:8px 11px;border:0;border-radius:8px;background:#fff;color:#315873;text-align:right;font-size:12px;font-weight:700;cursor:pointer} .wz-item:hover{background:#e5f0f9} .wz-item.sel{background:#3997c8;color:#fff} .wz-empty,.wz-loading{padding:18px 12px;color:#7e9bae;text-align:center;font-size:12px;font-weight:700} .wz-link{margin-top:12px;min-height:38px;padding:0 14px;border:1px solid #cce2f0;border-radius:10px;background:#fff;color:#277eaf;font-size:12px;font-weight:900;cursor:pointer} .wz-link:hover{background:#e9f4fc} .wz-create{margin-top:14px;padding:14px;border:1px solid #d5e7f2;border-radius:14px;background:#f5f9fd} .wz-create[hidden]{display:none} .wz-create>strong{display:block;margin-bottom:12px;font-size:13px;color:#2b506b} .wz-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 12px} .wz-field{margin:0 0 12px;min-width:0} .wz-field label{display:block;margin:0 0 6px;font-size:12px;font-weight:800;color:#2b506b} .wz-field input,.wz-field select{display:block;width:100%;min-height:42px;padding:0 12px;border:1px solid #d2e5f1;border-radius:11px;background:#fff;color:#24475f;font-size:12px;direction:rtl;outline:none} .wz-field input:focus,.wz-field select:focus{border-color:#409fd1;box-shadow:0 0 0 3px rgba(64,159,209,.12)} .wz-inline{display:flex;gap:8px;align-items:center} .wz-inline select{flex:1 1 auto} .wz-plus{flex:0 0 42px;width:42px;height:42px;border:1px solid #b3d5e9;border-radius:11px;background:#eaf4fb;color:#326588;font:900 22px/40px Tahoma;cursor:pointer} .wz-plus:hover{background:#3997c8;border-color:#3997c8;color:#fff} .wz-mini{display:flex;gap:8px;margin:0 0 12px} .wz-mini[hidden]{display:none} .wz-mini input{flex:1 1 auto;min-height:40px;padding:0 12px;border:1px solid #d2e5f1;border-radius:10px;font-size:12px;direction:rtl} .wz-static{margin:0 0 14px;padding:10px 12px;border:1px solid #d5e7f2;border-radius:10px;background:#f5f9fd;color:#487391;font-size:12px;font-weight:800} .wz-msg{min-height:20px;padding:0 22px 6px;font-size:11px;font-weight:800;color:#6d91ab} .wz-msg.err{color:#a33d3d} .wz-foot{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 22px 16px;border-top:1px solid #e2e6e9;background:#fff} .wz-foot-r,.wz-foot-l{display:flex;gap:9px} .wz-btn{min-height:42px;padding:0 20px;border-radius:10px;border:1px solid #d8dde7;background:#fff;color:#487391;font-size:12px;font-weight:900;cursor:pointer} .wz-btn.primary,.wz-primary{border:1px solid #277eaf;background:linear-gradient(135deg,#3997c8,#277eaf);color:#fff;box-shadow:0 8px 18px rgba(39,126,175,.18);border-radius:10px;min-height:42px;padding:0 18px;font-size:12px;font-weight:900;cursor:pointer} .wz-btn:disabled,.wz-primary:disabled,.wz-link:disabled{opacity:.55;cursor:not-allowed} .wz-btn:focus-visible,.wz-primary:focus-visible,.wz-item:focus-visible,.wz-plus:focus-visible,.wz-link:focus-visible{outline:2px solid #409fd1;outline-offset:2px} #mqDetail .wz-dialog{width:min(620px,94vw)} .dt-row{display:flex;justify-content:space-between;gap:14px;padding:11px 2px;border-bottom:1px solid #e7f2fb;font-size:12px} .dt-row span:first-child{color:#7e9bae;font-weight:800} .dt-row span:last-child{color:#2b5672;font-weight:800;text-align:left} .mq-tbl{width:100%;border-collapse:collapse;direction:rtl;background:#fff} .mq-tbl th,.mq-tbl td{padding:12px 14px;text-align:right;font-size:12px;border-bottom:1px solid #e5f0f9;color:#294e68;font-weight:700} .mq-tbl th{background:#ecf5fc;color:#47677d;font-weight:900} .mq-tbl-wrap{border:1px solid #d7dde2;border-radius:14px;overflow:auto;background:#fff} @media(max-width:760px){.wz-steps{grid-template-columns:repeat(2,minmax(0,1fr))}.wz-grid{grid-template-columns:1fr}} /* MediQ hospital-blue palette. */ #mediq-dashboard .mq-welcome-dot{background:#409fd1!important;box-shadow:0 0 0 4px rgba(64,159,209,.12)!important} .wz-btn.primary,.wz-primary{background:linear-gradient(135deg,#4ca9d8,#328fc1);border-color:#328fc1;box-shadow:0 8px 18px rgba(64,159,209,.2)} .wz-step.active{background:#368fbe;border-color:#368fbe;color:white} .wz-step.active b{background:rgba(255,255,255,.18);color:white} .wz-step.active span{color:white} .wz-item.sel{background:#368fbe;color:white} /* Large minimal duotone illustrations and structured wizard. */ #mediq-dashboard .mq-module-icon{width:110px;height:110px;border-radius:24px;background:#f2f6f8;color:#4e6979;margin-bottom:16px} #mediq-dashboard .mq-module-icon svg{width:72px;height:72px;stroke-width:1.25} #mediq-dashboard .mq-action-icon{width:108px;height:108px;border-radius:22px;background:#f2f6f8;color:#4e6979} #mediq-dashboard .mq-action-icon svg{width:75px;height:75px;stroke-width:1.25} #mediq-dashboard .mq-module-card{min-height:216px} #mediq-dashboard .mq-action-card{min-height:148px} .wz-step{flex-direction:column;gap:4px;min-height:65px} .wz-step .wz-step-heading{display:flex;align-items:center;justify-content:center;gap:6px} .wz-step .wz-step-value{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:600;color:inherit} .wz-group-tree,.wz-group-tree ul{list-style:none;margin:0;padding:0 18px 0 0;position:relative} .wz-group-tree{padding:4px 0} .wz-group-tree ul{margin-right:15px;border-right:1px solid #bacbd5} .wz-group-tree li{position:relative;margin:3px 0} .wz-group-tree ul>li:before{content:"";position:absolute;right:-18px;top:19px;width:18px;border-top:1px solid #bacbd5} .wz-tree-line{display:flex;align-items:center;gap:4px} .wz-tree-line .wz-item{width:auto;flex:1;min-width:0;white-space:normal} .wz-tree-toggle,.wz-tree-spacer{width:26px;flex:0 0 26px;height:30px} .wz-tree-toggle{border:0;border-radius:6px;background:#edf2f5;color:#435c6d;cursor:pointer;font:700 17px Tahoma} .wz-tree-toggle:focus-visible{outline:2px solid #69737d} .wz-segment{padding:14px;margin:0 0 13px;border:1px solid #dce5eb;border-radius:13px;background:#fff;min-inline-size:0} .wz-segment legend{padding:0 8px;color:#394e5e;font-size:12px;font-weight:900} .wz-segment .wz-field:last-child{margin-bottom:0} .wz-context{font-size:11px;font-weight:600;line-height:1.8;color:#6c8190;margin-top:8px} @media(max-width:760px){#mediq-dashboard .mq-card-grid{grid-template-columns:repeat(2,minmax(0,1fr))}#mediq-dashboard .mq-action-grid{grid-template-columns:1fr}.wz-step{padding:5px}.wz-step .wz-step-value{font-size:9px}} .wz-segment-tabs{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 15px;padding-bottom:10px;border-bottom:1px solid #e2e7eb} .wz-segment-tabs button{padding:9px 12px;border:1px solid #d4dfe6;border-radius:9px;background:#f5f8fa;color:#526777;font:700 11px Tahoma;cursor:pointer} .wz-segment-tabs button.active{background:#69737d;color:white;border-color:#69737d} .wz-segment[hidden]{display:none!important} /* Float above the form without occupying a grid row or being clipped by form scroll. */ #mqWz .mq-jcalendar.mq-date-floating{position:fixed!important;z-index:50;margin:0!important;max-width:calc(100vw - 20px);padding:12px;background:#fff;border:1px solid #cce2f0;border-radius:12px;box-shadow:0 16px 48px rgba(23,65,86,.24);overflow:auto;direction:rtl} :is(#mqWz,#vDialog) .mq-date-floating[hidden]{display:none!important} :is(#mqWz,#vDialog) .mq-date-floating .mq-jcal-head{display:flex;align-items:center;justify-content:space-between;gap:8px} :is(#mqWz,#vDialog) .mq-date-floating .mq-jcal-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:4px;text-align:center;margin:10px 0} :is(#mqWz,#vDialog) .mq-date-floating button{border:1px solid #d5e7f2;border-radius:6px;padding:5px;background:#f1f8fd;color:#315873;cursor:pointer;font:inherit} :is(#mqWz,#vDialog) .mq-date-floating button:hover{background:#e0f0fa} /* V11 layout and accessible operation dialog */ #mediq-dashboard .mq-logo img{width:121.8px!important} #mediq-dashboard .mq-list-layout{grid-template-columns:297px minmax(0,1fr)} #mediq-dashboard .v-five{grid-template-columns:repeat(5,minmax(0,1fr))} #mediq-dashboard button.mq-module-card{font:inherit;text-align:right;cursor:pointer;display:flex;flex-direction:column;align-items:flex-start} #mediq-dashboard .v-tag{display:inline-block;border-radius:8px;padding:5px 8px;font-size:11px;line-height:1.8} #mediq-dashboard .v-tag.green{color:#17633d;background:#e5f5eb} #mediq-dashboard .v-tag.orange{color:#8c4808;background:#fff0df} #mediq-dashboard .v-active{display:block;color:#ab590c;font-size:10px} #mediq-dashboard .v-summary-row{display:flex;flex-direction:column;gap:8px;padding:14px 0;border-bottom:1px solid #dce8ee;font-size:12px} #mediq-dashboard .v-summary-row span{color:#6c8190} #mediq-dashboard .v-summary-row b{line-height:1.8} #mediq-dashboard .v-steps{display:flex;flex-direction:column;gap:8px} #mediq-dashboard .v-steps>div{border-right:4px solid #dce8ee;padding:10px;background:#f4f8fb;border-radius:7px;font-size:11px} #mediq-dashboard .v-steps>.current{background:#44525f;color:white;border-color:#44525f} #mediq-dashboard .v-steps>.passed{background:#e5f5eb;border-color:#58a97a} #mediq-dashboard .v-search{display:flex;gap:7px;flex-wrap:wrap} #mediq-dashboard .v-search input{min-width:180px;border:1px solid #cbdfea;border-radius:8px;padding:10px;font:inherit} #mediq-dashboard #vService{color:#9a5b10;font-size:11px} #mediq-dashboard .v-overlay{position:fixed;inset:0;background:#122f4590;z-index:100100;display:flex;align-items:center;justify-content:center;padding:18px;direction:rtl} #mediq-dashboard .v-overlay[hidden]{display:none} #mediq-dashboard .v-dialog{width:min(920px,96vw);max-height:92vh;display:flex;flex-direction:column;background:#fff;border:1px solid #cbdfea;border-radius:18px;box-shadow:0 20px 80px #163d4950;overflow:hidden} #mediq-dashboard .v-dialog header{display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-bottom:1px solid #dce8ee} #mediq-dashboard .v-dialog header button{border:0;background:#edf5fa;border-radius:8px;width:35px;height:35px;font-size:24px;cursor:pointer} #mediq-dashboard .v-dialog-body{overflow:auto;padding:20px;min-height:0} #mediq-dashboard #vMessage{margin:0;padding:12px 20px;background:#f2f8fc;white-space:pre-wrap;line-height:1.8;font-size:12px} #mediq-dashboard .v-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin:16px 0} #mediq-dashboard .v-fields label{display:flex;flex-direction:column;gap:8px;font-size:12px} #mediq-dashboard .v-fields input,#mediq-dashboard .v-fields select,#mediq-dashboard .v-fields textarea,#mediq-dashboard #vProcessSearch{font:inherit;padding:10px;border:1px solid #cbdfea;border-radius:8px;background:white;width:100%;box-sizing:border-box} #mediq-dashboard .v-choice{display:flex;align-items:center;gap:10px;padding:12px;border-bottom:1px solid #e7edf1;font-size:12px;cursor:pointer} #mediq-dashboard .v-choice small{margin-right:auto;color:#789} #mediq-dashboard .v-operation-choices{display:flex;flex-wrap:wrap;gap:8px} #mediq-dashboard .v-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:20px} #mediq-dashboard .v-stats>div{background:white;border:1px solid #cbdfea;padding:30px;display:flex;flex-direction:column;gap:12px;border-radius:16px} #mediq-dashboard .v-stats strong{font-size:30px;color:#318fbd} @media(max-width:1100px){#mediq-dashboard .v-five{grid-template-columns:repeat(3,minmax(0,1fr))}#mediq-dashboard .mq-list-layout{grid-template-columns:230px minmax(0,1fr)}} @media(max-width:760px){#mediq-dashboard .v-five{grid-template-columns:repeat(2,minmax(0,1fr))}#mediq-dashboard .mq-list-layout{grid-template-columns:1fr}#mediq-dashboard .v-fields{grid-template-columns:1fr}#mediq-dashboard .v-choice{flex-wrap:wrap}} #mediq-dashboard .v-attribute-list{max-height:220px;overflow:auto;border:1px solid #cbdfea;border-radius:8px;margin:12px 0;padding:12px;display:flex;flex-direction:column;gap:12px}#mediq-dashboard .v-attribute-list label[hidden]{display:none} #mediq-dashboard .v-editor-tabs{display:flex;gap:6px;flex-wrap:wrap;position:sticky;top:-20px;z-index:2;background:white;padding:12px 0;border-bottom:1px solid #d4e5ee} #mediq-dashboard .v-editor-tabs button{font:inherit;font-size:12px;cursor:pointer;border:1px solid #cbdfea;border-radius:9px;padding:10px;background:#f2f8fc;color:#385d73} #mediq-dashboard .v-editor-tabs button.active{background:#485762;border-color:#485762;color:white} #mediq-dashboard [data-edit-panel][hidden]{display:none} #mediq-dashboard .v-editor-footer{display:flex;justify-content:space-between;align-items:center;gap:12px;position:sticky;bottom:-20px;background:#fff;padding:14px 0;border-top:1px solid #d4e5ee;font-size:11px;z-index:2} #mediq-dashboard .v-fields textarea{min-height:90px} #mediq-dashboard .v-fields small{color:#7b8c98} #mediq-dashboard #vDialog .mq-date-floating{position:fixed;z-index:100120;display:block;overflow:auto;background:white;border:1px solid #c3d9e5;border-radius:12px;padding:12px;box-shadow:0 14px 40px #203d5b30;box-sizing:border-box} #mediq-dashboard #vDialog .mq-date-floating[hidden]{display:none} #mediq-dashboard .v-live-timeline{direction:rtl;background:white;border:1px solid #d0e2ec;border-radius:14px;padding:18px 20px;margin:0 0 20px;min-width:0} #mediq-dashboard .v-live-timeline header{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:24px} #mediq-dashboard .v-live-timeline header>div{display:flex;flex-direction:column;gap:7px;min-width:0} #mediq-dashboard .v-live-timeline header span{font-size:11px;color:#6d8795;overflow-wrap:anywhere} #mediq-dashboard .v-live-timeline header>small{font-size:10px;color:#698b8b;display:flex;align-items:center;gap:5px;white-space:nowrap} #mediq-dashboard .v-live-timeline header>small>i{width:6px;height:6px;border-radius:50%;background:#16b66a;display:block} #mediq-dashboard .v-live-timeline header>small.stale{color:#a46515} #mediq-dashboard .v-live-timeline header>small.stale>i{background:#d58c30} #mediq-dashboard .v-circle-track{list-style:none;margin:0;padding:0;display:flex;direction:rtl;align-items:flex-start} #mediq-dashboard .v-circle-step{flex:1;min-width:0;text-align:center;position:relative;padding:0 6px;line-height:1.7} #mediq-dashboard .v-circle-rail{position:relative;height:30px;margin-bottom:8px} #mediq-dashboard .v-circle-node{position:relative;z-index:1;display:flex;align-items:center;justify-content:center;width:24px;height:24px;margin:0 auto;border-radius:50%;border:2px solid #cadce5;background:#e0eaf0;box-shadow:0 0 0 4px white;box-sizing:border-box;color:white;font-size:15px;font-weight:bold} #mediq-dashboard .v-circle-line{position:absolute;top:11px;right:50%;width:calc(100% + 12px);height:3px;background:#d9e5ec} #mediq-dashboard .v-circle-step:last-child .v-circle-line{display:none} #mediq-dashboard .v-circle-step.done .v-circle-node{background:#15b464;border-color:#15b464} #mediq-dashboard .v-circle-line.done{background:#15b464} #mediq-dashboard .v-circle-step.current .v-circle-node{border-color:#087eaa;background:white} #mediq-dashboard .v-circle-step.current .v-circle-node>i{display:block;width:8px;height:8px;border-radius:50%;background:#087eaa;animation:v13-pulse 1.6s ease-in-out infinite} #mediq-dashboard .v-circle-step strong{display:block;font-size:11px;color:#335e76;overflow-wrap:anywhere} #mediq-dashboard .v-circle-step.current strong{color:#087eaa} #mediq-dashboard .v-circle-step small,#mediq-dashboard .v-circle-step time{display:block;font-size:10px;color:#8ba0ae} #mediq-dashboard .v-circle-step.current small{color:#087eaa;font-weight:bold} #mediq-dashboard .v-live-timeline footer{display:flex;justify-content:space-between;gap:14px;border-top:1px solid #edf3f7;margin-top:20px;padding-top:12px;font-size:11px} #mediq-dashboard .v-timeline-warning{font-size:11px;color:#a46515} @keyframes v13-pulse{0%,100%{box-shadow:0 0 0 0 #087eaa40}50%{box-shadow:0 0 0 6px #087eaa10}} @media(prefers-reduced-motion:reduce){#mediq-dashboard .v-circle-step.current .v-circle-node>i{animation:none}} @media(max-width:760px){#mediq-dashboard .v-live-timeline header{flex-direction:column}#mediq-dashboard .v-circle-track{flex-direction:column;gap:0}#mediq-dashboard .v-circle-step{width:100%;text-align:right;padding:0 40px 22px 0;box-sizing:border-box}#mediq-dashboard .v-circle-rail{position:absolute;right:0;top:0;width:24px;height:100%;margin:0}#mediq-dashboard .v-circle-line{top:24px;right:11px;height:calc(100% - 12px);width:3px}#mediq-dashboard .v-circle-step:last-child{padding-bottom:0}} /* Keep row actions together; status dashboard and restrained hospital-blue styling. */ #mediq-dashboard #vAssetDashboard{margin-bottom:20px;direction:rtl} #mediq-dashboard .v-dashboard-heading{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:0 2px 12px} #mediq-dashboard .v-dashboard-heading>div{display:flex;flex-direction:column;gap:6px} #mediq-dashboard .v-dashboard-heading strong{font-size:16px;color:#245574} #mediq-dashboard .v-dashboard-heading span,#mediq-dashboard .v-dashboard-heading small{font-size:11px;color:#7893a5} #mediq-dashboard .v-status-cards{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px} #mediq-dashboard .v-stat-card{--stat-color:#318ebe;--stat-tint:#edf7fd;position:relative;overflow:hidden;text-align:right;font:inherit;cursor:pointer;border:1px solid #d5e6ef;border-radius:17px;padding:18px 20px 16px;background:#fff;color:#345e78;display:grid;grid-template-columns:1fr 48px;gap:8px 12px;box-shadow:0 6px 22px #396a8a06;transition:border-color .16s,box-shadow .16s,transform .16s;min-width:0} #mediq-dashboard .v-stat-card.active{--stat-color:#20996a;--stat-tint:#edf9f3} #mediq-dashboard .v-stat-card.inactive{--stat-color:#d58a34;--stat-tint:#fff6e9} #mediq-dashboard .v-stat-card.other{--stat-color:#7a88a3;--stat-tint:#f0f3f8} #mediq-dashboard .v-stat-card:hover{transform:translateY(-2px);border-color:var(--stat-color);box-shadow:0 8px 26px #316b8a12} #mediq-dashboard .v-stat-card.selected{border-color:var(--stat-color);box-shadow:inset 0 0 0 1px var(--stat-color),0 6px 22px #396a8a08} #mediq-dashboard .v-stat-card:focus-visible{outline:3px solid #8dcced;outline-offset:3px} #mediq-dashboard .v-stat-icon{grid-column:2;grid-row:1/span 2;width:46px;height:46px;display:flex;align-items:center;justify-content:center;border-radius:14px;background:var(--stat-tint);color:var(--stat-color)} #mediq-dashboard .v-stat-icon svg{width:27px;height:27px} #mediq-dashboard .v-stat-label{grid-column:1;grid-row:1;font-size:12px;color:#597b91;align-self:center} #mediq-dashboard .v-stat-card>strong{grid-column:1;grid-row:2;font-size:28px;line-height:1.3;color:#244e68} #mediq-dashboard .v-stat-bottom{grid-column:1/-1;font-size:10px;color:#8ba2b1;margin-top:5px} #mediq-dashboard .v-stat-meter{grid-column:1/-1;height:4px;border-radius:5px;background:var(--stat-tint);overflow:hidden;margin-top:2px} #mediq-dashboard .v-stat-meter>i{display:block;height:100%;background:var(--stat-color);border-radius:5px} #mediq-dashboard #mqAssetsHost .mq-tbl{table-layout:auto!important;width:100%;border-collapse:separate;border-spacing:0} #mediq-dashboard #mqAssetsHost .mq-tbl th{padding:14px 10px;background:#edf6fc;font-size:11px;line-height:1.7;color:#50738a;vertical-align:middle} #mediq-dashboard #mqAssetsHost .mq-tbl td{padding:15px 10px;vertical-align:middle;border-bottom:1px solid #e8f0f5;font-size:11px;line-height:1.85} #mediq-dashboard #mqAssetsHost .mq-tbl tr:last-child td{border-bottom:0} #mediq-dashboard #mqAssetsHost .mq-tbl tbody tr{transition:background .15s;cursor:pointer} #mediq-dashboard #mqAssetsHost .mq-tbl tbody tr:hover{background:#f6fbfe} #mediq-dashboard #mqAssetsHost .mq-tbl th:last-child,#mediq-dashboard #mqAssetsHost .mq-tbl td:last-child{width:156px;min-width:156px;white-space:nowrap} #mediq-dashboard .v-row-actions{display:inline-flex!important;flex-direction:row!important;flex-wrap:nowrap!important;align-items:center;justify-content:center;gap:6px;white-space:nowrap} #mediq-dashboard .v-row-actions .mq-assets-btn{display:inline-flex!important;align-items:center;justify-content:center;gap:5px;min-width:66px;margin:0!important;padding:7px 9px!important;border-radius:9px;font-size:10px!important;white-space:nowrap;min-height:34px} #mediq-dashboard .v-row-actions .mq-assets-btn svg{width:14px;height:14px;flex:0 0 14px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round} #mediq-dashboard .v-row-actions [data-detail]{background:#f1f8fd;border-color:#d5e6ef;color:#377caa} #mediq-dashboard .v-row-actions [data-vedit]{background:#fff;border-color:#bdd8e8;color:#377caa} #mediq-dashboard .v-row-actions button:disabled{opacity:.45;cursor:not-allowed} #mediq-dashboard .v-status-pill{display:inline-flex;align-items:center;gap:5px;border-radius:8px;background:#f0f3f8;color:#65758f;padding:4px 8px;font-size:10px;white-space:nowrap} #mediq-dashboard .v-status-pill:before{content:'';width:5px;height:5px;border-radius:50%;background:currentColor} #mediq-dashboard .v-status-pill.active{background:#ecf8f0;color:#27875b} #mediq-dashboard .v-status-pill.inactive{background:#fff5e8;color:#a57532} #mediq-dashboard .v-tag{max-width:210px;overflow-wrap:anywhere;line-height:1.8;padding:5px 9px;border:1px solid transparent} #mediq-dashboard .v-tag.green{background:#edf8f1;color:#3b8060;border-color:#e2f0e7} #mediq-dashboard .v-tag.orange{background:#fff4e8;color:#a57532;border-color:#faecd9} #mediq-dashboard .mq-list-menu{border-color:#d5e6ef;box-shadow:0 6px 24px #396a8a05} #mediq-dashboard .v-summary-row{padding:13px 0} @media(max-width:1150px){#mediq-dashboard .v-status-cards{grid-template-columns:repeat(2,minmax(0,1fr))}#mediq-dashboard .mq-list-layout{grid-template-columns:240px minmax(0,1fr)}} @media(max-width:900px){#mediq-dashboard .mq-list-layout{grid-template-columns:1fr}#mediq-dashboard #mqAssetsHost .mq-tbl th:last-child,#mediq-dashboard #mqAssetsHost .mq-tbl td:last-child{min-width:146px;width:146px}} @media(max-width:600px){#mediq-dashboard .v-dashboard-heading{align-items:flex-start;flex-direction:column;gap:7px}#mediq-dashboard .v-stat-card{padding:14px;grid-template-columns:1fr 32px}#mediq-dashboard .v-stat-icon{width:32px;height:32px;border-radius:10px}#mediq-dashboard .v-stat-icon svg{width:21px;height:21px}#mediq-dashboard .v-stat-label{font-size:10px}#mediq-dashboard .v-stat-card>strong{font-size:24px}} /* V15: dependent attribute values and compact vertical process under sidebar details. */ #mediq-dashboard .v-smart-filter{display:flex;flex-direction:column;gap:9px;direction:rtl} #mediq-dashboard .v-smart-filter label{font-size:12px;font-weight:900;color:#315873} #mediq-dashboard .v-smart-filter select,#mediq-dashboard .v-smart-filter input{width:100%;max-width:100%;min-height:39px;border:1px solid #cbdfea;border-radius:9px;padding:8px 11px;background:white;color:#315873;outline:none;font:12px Tahoma,Arial;box-sizing:border-box} #mediq-dashboard .v-smart-filter select:focus,#mediq-dashboard .v-smart-filter input:focus{border-color:#3997c8;box-shadow:0 0 0 3px #3997c822} #mediq-dashboard .v-smart-filter #vFilterDetails{display:flex;flex-direction:column;gap:9px;margin-top:8px} #mediq-dashboard .v-smart-filter #vFilterDetails[hidden]{display:none!important} #mediq-dashboard .v-smart-filter #vFilterValue{height:178px;overflow:auto} #mediq-dashboard .v-smart-filter #vFilterValue option{padding:8px;white-space:normal} #mediq-dashboard .v-smart-filter small,#mediq-dashboard .v-filter-hint{font-size:11px;color:#7995a7} #mediq-dashboard .v-filter-actions{display:flex;justify-content:flex-start;margin-top:4px} #mediq-dashboard .v-filter-chip{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:7px 0;padding:9px 11px;border:1px solid #d4e6f0;background:#f1f8fd;border-radius:9px;font-size:11px;color:#305b78;font-weight:700} #mediq-dashboard .v-filter-chip button{border:0;background:#e5f6ee;color:#15986b;font-size:17px;font-weight:900;border-radius:6px;cursor:pointer;min-width:27px;min-height:27px} #mediq-dashboard #vFilterList h4{font-size:12px;margin:15px 0 5px} #mediq-dashboard .mq-list-menu #vLiveTimeline{margin:18px 0 0;padding:15px 5px 5px;border:0;border-top:1px solid #dce9f1;border-radius:0;box-shadow:none;background:transparent} #mediq-dashboard .mq-list-menu #vLiveTimeline header{margin-bottom:17px} #mediq-dashboard .mq-list-menu #vLiveTimeline header strong{font-size:13px;color:#245574} #mediq-dashboard .mq-list-menu #vLiveTimeline .v-circle-track{display:flex;flex-direction:column;align-items:stretch;gap:0} #mediq-dashboard .mq-list-menu #vLiveTimeline .v-circle-step{width:100%;min-height:69px;flex:none;text-align:right;padding:0 38px 18px 0} #mediq-dashboard .mq-list-menu #vLiveTimeline .v-circle-rail{position:absolute;right:0;top:0;width:27px;height:100%;margin:0} #mediq-dashboard .mq-list-menu #vLiveTimeline .v-circle-node{margin:0;width:24px;height:24px} #mediq-dashboard .mq-list-menu #vLiveTimeline .v-circle-line{position:absolute;top:24px;right:11px;width:3px;height:calc(100% - 20px)} #mediq-dashboard .mq-list-menu #vLiveTimeline .v-circle-step strong{font-size:11px} #mediq-dashboard .mq-list-menu #vLiveTimeline .v-circle-step small{font-size:10px} /* Inline Jira Assets-style attribute filtering; never uses the dialog overlay. */ #mediq-dashboard .v-filter-anchor{position:relative;display:flex;align-items:center;gap:8px;flex-wrap:wrap} #mediq-dashboard .v-inline-filters{position:absolute;top:calc(100% + 8px);right:0;z-index:80;width:min(610px,calc(100vw - 70px));max-height:min(560px,75vh);overflow:auto;direction:rtl;background:#fff;border:1px solid #cbd9e4;border-radius:8px;box-shadow:0 14px 40px rgba(21,55,75,.18);padding:12px;text-align:right} #mediq-dashboard .v-filter-top{display:flex;align-items:center;justify-content:space-between;padding:3px 5px 12px;border-bottom:1px solid #e4edf3;font-size:13px;color:#245574} #mediq-dashboard .v-filter-top button{border:0;background:transparent;font-size:23px;cursor:pointer;color:#55748a} #mediq-dashboard .v-filter-columns{display:grid;grid-template-columns:minmax(160px,1fr) minmax(200px,1.2fr);gap:12px;padding-top:12px} #mediq-dashboard .v-filter-attributes{border-left:1px solid #e4edf3;padding-left:10px;min-width:0} #mediq-dashboard .v-filter-attributes input,#mediq-dashboard .v-filter-values input,#mediq-dashboard .v-filter-values select{width:100%;min-height:34px;max-width:100%;padding:7px 9px;border:1px solid #ccdce7;border-radius:5px;background:#fff;color:#315873;box-sizing:border-box;font:12px Tahoma} #mediq-dashboard .v-attribute-list{max-height:290px;overflow-y:auto;margin-top:8px} #mediq-dashboard .v-attribute-choice{display:flex;align-items:center;gap:9px;width:100%;min-height:34px;border:0;background:#fff;color:#315873;text-align:right;padding:6px;cursor:pointer;font:12px Tahoma} #mediq-dashboard .v-attribute-choice:hover{background:#ecf5fc} #mediq-dashboard .v-checkmark{display:inline-flex;justify-content:center;align-items:center;width:15px;height:15px;border:1px solid #a7b7c4;border-radius:2px;color:#247eaf;font-weight:bold;flex:none} #mediq-dashboard .v-filter-values{min-width:0} #mediq-dashboard .v-filter-values #vFilterDetails{display:flex;flex-direction:column;gap:8px} #mediq-dashboard .v-filter-values #vFilterDetails[hidden],#mediq-dashboard .v-filter-values #vFilterPickHint[hidden]{display:none!important} #mediq-dashboard .v-filter-values label{font-size:12px;font-weight:700;color:#345c74} #mediq-dashboard .v-filter-values #vFilterValue{height:166px;overflow:auto} #mediq-dashboard .v-filter-values #vFilterValue option{padding:7px} #mediq-dashboard .v-filter-values small,#mediq-dashboard .v-filter-values p{font-size:11px;color:#7893a5} #mediq-dashboard .v-inline-filters #vFilterList{border-top:1px solid #e5edf3;margin-top:10px;padding-top:6px} @media(max-width:650px){#mediq-dashboard .v-filter-columns{grid-template-columns:1fr}#mediq-dashboard .v-filter-attributes{border-left:0;border-bottom:1px solid #e4edf3;padding-bottom:9px}#mediq-dashboard .v-attribute-list{max-height:155px}} /* V18 - Inline checkbox selection, no separate active filter section */ #mediq-dashboard .v-filter-checklist{height:166px;overflow-y:auto;border:1px solid #ccdce7;border-radius:5px;background:white;padding:4px!important} #mediq-dashboard .v-filter-check-option{display:flex!important;flex-direction:row!important;align-items:center;gap:9px;min-height:33px;margin:0!important;padding:5px 8px;cursor:pointer;color:#315873;font-size:12px;font-weight:600} #mediq-dashboard .v-filter-check-option:hover{background:#eef7fc} #mediq-dashboard .v-filter-check-option:has(input:checked){background:#e5f3fc;color:#20577b} #mediq-dashboard .v-filter-check-option input[type=checkbox]{width:16px!important;height:16px!important;min-height:0!important;flex:0 0 16px;margin:0!important;accent-color:#3997c8;cursor:pointer} #mediq-dashboard .v-filter-check-option span{flex:1;min-width:0} #mediq-dashboard .v-filter-empty{margin:10px!important;text-align:center} /* V19: simultaneous attribute filters and right-aligned checkboxes */ #mediq-dashboard .v-attribute-choice, #mediq-dashboard .v-filter-check-option { direction:rtl !important; text-align:right !important; justify-content:flex-start !important; flex-direction:row !important; } #mediq-dashboard .v-attribute-choice { gap:9px !important; } #mediq-dashboard .v-attribute-choice .v-attribute-tick { display:inline-flex;align-items:center;justify-content:center; width:16px;height:16px;min-width:16px;flex:0 0 16px; border:1px solid #9bbad0;border-radius:3px; background:#fff;color:#fff;font-size:12px;font-weight:900; } #mediq-dashboard .v-attribute-choice[aria-pressed="true"] .v-attribute-tick { background:#3997c8;border-color:#3997c8;color:#fff; } #mediq-dashboard .v-attribute-current{background:#eaf4fc!important;} #mediq-dashboard .v-filter-check-option input[type="checkbox"]{ order:0!important;margin:0!important;float:none!important; position:static!important;inset:auto!important; flex:0 0 16px!important;align-self:center!important; } #mediq-dashboard .v-filter-check-option span{order:1!important;flex:1 1 auto!important;text-align:right!important;} /* ===== V26: scoped table alignment, purple department, hierarchy arrow ===== */ #mediq-dashboard .v-tag.purple{background:#f1e8ff!important;color:#773ab6!important;border:1px solid #e0c9ff!important} #mediq-dashboard #mqAssetsHost .mq-tbl th:nth-child(n+4), #mediq-dashboard #mqAssetsHost .mq-tbl td:nth-child(n+4){text-align:center!important;vertical-align:middle!important} #mediq-dashboard #mqAssetsHost .mq-tbl td:nth-child(4) .v-tag, #mediq-dashboard #mqAssetsHost .mq-tbl td:nth-child(5) .v-tag{margin:0 auto!important} #mediq-dashboard .mq-module-card.mq-has-children{position:relative!important;padding-bottom:40px!important} #mediq-dashboard .mq-module-card.mq-has-children .mq-hierarchy-arrow{position:absolute;bottom:12px;left:13px;width:25px;height:25px;display:flex;align-items:center;justify-content:center;border:1px solid #d6e4ed;border-radius:8px;background:#f1f7fb;color:#4484af;font:900 20px/1 Tahoma;pointer-events:none} /* V27 — compact RTL filters and animated live workflow step */ #mediq-dashboard .v-inline-filters{ width:min(510px,calc(100vw - 36px)) !important; max-height:min(500px,78vh) !important; padding:10px !important; direction:rtl !important; text-align:right !important; } #mediq-dashboard .v-filter-columns{ grid-template-columns:minmax(0,1fr) minmax(0,1.04fr) !important; gap:9px !important; direction:rtl !important; } #mediq-dashboard .v-filter-attributes{ min-width:0 !important;padding-left:8px !important; } #mediq-dashboard .v-filter-values,#mediq-dashboard .v-filter-values #vFilterDetails{ direction:rtl !important;text-align:right !important;min-width:0 !important; } #mediq-dashboard .v-attribute-choice, #mediq-dashboard .v-filter-check-option{ display:grid !important; grid-template-columns:16px minmax(0,1fr) !important; column-gap:7px !important; justify-content:initial !important; align-items:center !important; direction:rtl !important; text-align:right !important; width:100% !important; padding:5px 4px !important; box-sizing:border-box !important; } #mediq-dashboard .v-attribute-choice .v-attribute-tick, #mediq-dashboard .v-filter-check-option input[type="checkbox"]{ grid-column:1 !important; grid-row:1 !important; justify-self:start !important; margin:0 !important; order:initial !important; } #mediq-dashboard .v-attribute-choice>span:last-child, #mediq-dashboard .v-filter-check-option>span{ grid-column:2 !important;grid-row:1 !important; text-align:right !important;min-width:0 !important; order:initial !important;flex:initial !important; line-height:1.8 !important; } #mediq-dashboard .v-filter-checklist{padding:4px !important;} #mediq-dashboard .v-filter-values label, #mediq-dashboard .v-filter-values input, #mediq-dashboard .v-filter-values select{ direction:rtl !important;text-align:right !important; } #mediq-dashboard .v-circle-step.current .v-circle-node{ animation:mq-live-circle 1.65s ease-in-out infinite !important; } #mediq-dashboard .v-circle-step.current .v-circle-node>i{ animation:mq-live-dot 1.65s ease-in-out infinite !important; } @keyframes mq-live-circle{ 0%,100%{box-shadow:0 0 0 3px #ffffff,0 0 0 4px rgba(8,126,170,.12);border-color:#087eaa} 50%{box-shadow:0 0 0 4px #ffffff,0 0 0 10px rgba(8,126,170,.20);border-color:#0c9ac8} } @keyframes mq-live-dot{ 0%,100%{opacity:1;transform:scale(1)} 50%{opacity:.32;transform:scale(.55)} } @media(max-width:540px){ #mediq-dashboard .v-filter-columns{grid-template-columns:1fr !important} #mediq-dashboard .v-filter-attributes{border-left:0 !important;border-bottom:1px solid #e4edf3 !important;padding-bottom:8px !important} } /* V28 — visible live step + hierarchy corner indicator */ #mediq-dashboard .mq-card-grid.v-five .mq-module-card.mq-has-children{ position:relative!important;padding-bottom:40px!important; } #mediq-dashboard .mq-card-grid.v-five .mq-hierarchy-arrow{ position:absolute!important;left:13px!important;bottom:12px!important; display:flex!important;visibility:visible!important;opacity:1!important; width:27px!important;height:27px!important;align-items:center!important;justify-content:center!important; border:1px solid #bfd8e9!important;border-radius:8px!important; background:#eaf5fc!important;color:#257eaf!important; font:900 19px/1 Tahoma,Arial,sans-serif!important; pointer-events:none!important;z-index:3!important; } #mediq-dashboard .v-circle-step.current .v-circle-node{ animation:mediq-v28-live 1.15s ease-in-out infinite!important; will-change:box-shadow,background-color,transform; } #mediq-dashboard .v-circle-step.current .v-circle-node>i{ animation:mediq-v28-dot 1.15s ease-in-out infinite!important; } @keyframes mediq-v28-live{ 0%,100%{background:#fff;border-color:#087eaa;box-shadow:0 0 0 3px #fff,0 0 0 4px rgba(0,139,207,.15);transform:scale(1)} 50%{background:#d8f1ff;border-color:#0077b6;box-shadow:0 0 0 4px #fff,0 0 0 10px rgba(0,139,207,.36);transform:scale(1.12)} } @keyframes mediq-v28-dot{ 0%,100%{opacity:1;transform:scale(1)} 50%{opacity:.18;transform:scale(.4)} } /* V29 — strong, clearly visible active-workflow blink. */ #mediq-dashboard .mq-list-menu #vLiveTimeline .v-circle-step.current .v-circle-node, #mediq-dashboard #vLiveTimeline .v-circle-step.current .v-circle-node { animation: mediq-v29-blink 1s steps(1,end) infinite !important; transform:none !important; will-change:background-color,box-shadow !important; } #mediq-dashboard .mq-list-menu #vLiveTimeline .v-circle-step.current .v-circle-node>i, #mediq-dashboard #vLiveTimeline .v-circle-step.current .v-circle-node>i { animation: mediq-v29-dot 1s steps(1,end) infinite !important; } @keyframes mediq-v29-blink { 0%, 100% { background:#fff; border-color:#087eaa; box-shadow:0 0 0 4px #fff,0 0 0 5px rgba(0,125,190,.18); } 50% { background:#087eaa; border-color:#087eaa; box-shadow:0 0 0 4px #fff,0 0 0 11px rgba(0,125,190,.40); } } @keyframes mediq-v29-dot { 0%,100% { background:#087eaa; opacity:1; } 50% { background:#fff; opacity:1; } } /* V30 - focused UI refinements */ #mediq-dashboard .mq-header{display:none!important} #mediq-dashboard .mq-hero{margin-top:18px!important;min-height:110px!important;overflow:visible!important} #mediq-dashboard .mq-hero .mq-header-left{position:relative;z-index:3;display:flex!important;flex-wrap:wrap!important;margin:0!important} #mediq-dashboard .mq-hero .mq-header-welcome{color:#37617c!important} #mediq-dashboard .mq-breadcrumb{margin-top:14px!important;min-height:48px!important} #mediq-dashboard .mq-tree-title{margin-top:8px!important} #mediq-dashboard .mq-assets-actions{order:-1} #mediq-dashboard .mq-assets-btn.primary,#mediq-dashboard #vProcess,#mediq-dashboard #mqAssetsNew,#mediq-dashboard #vReview,#mediq-dashboard #vCommit{background:#179967!important;border-color:#179967!important;color:#fff!important} #mediq-dashboard .mq-assets-btn.primary:hover,#mediq-dashboard #vProcess:hover{background:#0c7c51!important} #mediq-dashboard .v-process-controls{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:12px 0} #mediq-dashboard .v-process-controls label{font-size:12px;font-weight:700;color:#315873;display:flex;flex-direction:column;gap:7px} #mediq-dashboard .v-process-controls select{width:100%;padding:9px;border:1px solid #cbdfea;border-radius:8px;background:#fff} #mediq-dashboard .v-process-table{width:100%;border-collapse:collapse;margin-top:12px;font-size:11px} #mediq-dashboard .v-process-table th,#mediq-dashboard .v-process-table td{padding:10px 7px;border-bottom:1px solid #deebf3;text-align:center;vertical-align:middle} #mediq-dashboard .v-process-table th{background:#edf6fc;color:#315873} #mediq-dashboard .v-active-flag{display:inline-block;width:8px;height:8px;border-radius:50%;margin-left:5px;background:#16a46b} #mediq-dashboard .v-active-flag.inactive{background:#e08c44} #mediq-dashboard .v-process-searchline{margin-top:15px} @media(max-width:750px){#mediq-dashboard .v-process-controls{grid-template-columns:1fr}#mediq-dashboard .mq-hero{flex-wrap:wrap;gap:10px}} #mediq-dashboard .mq-tree-row.level-2,#mediq-dashboard .mq-tree-row.level-3,#mediq-dashboard .mq-tree-row.level-4,#mediq-dashboard .mq-tree-children,#mediq-dashboard .mq-tree-separator{display:none!important} #mediq-dashboard .mq-tree-row.level-1{min-height:48px!important} #mediq-dashboard .mq-tree-title{font-size:12px!important} /* V31: five-item primary tree, no former cycle navigation */ #mediq-dashboard .mq-tree-v31{margin-top:18px;gap:8px;overflow-y:auto;} #mediq-dashboard .mq-tree-v31 .mq-tree-row{min-height:48px;padding:0 13px;font-size:13px;white-space:normal;line-height:1.8;} #mediq-dashboard .mq-tree-v31 .mq-tree-dot{flex:0 0 6px;} #mediq-dashboard .mq-tree-v31 .mq-tree-row.active{background:linear-gradient(90deg,#3997c8,#277eaf);} #mediq-dashboard .v32-review-top{display:inline-flex!important;margin:10px 0 14px!important;align-items:center;justify-content:center} /* V32 - keep main navigation blue; only operational submit buttons soft green */ #mediq-dashboard .mq-assets-btn.primary,#mediq-dashboard #mqAssetsNew,#mediq-dashboard #vProcess{background:linear-gradient(135deg,#429ed0,#2c88bb)!important;border-color:#328fbe!important;color:#fff!important} #mediq-dashboard #vReview,#mediq-dashboard #vCommit,#mediq-dashboard .v-dialog .mq-assets-btn.primary{background:#43a981!important;border-color:#43a981!important;color:#fff!important} #mediq-dashboard #vReview:hover,#mediq-dashboard #vCommit:hover{background:#339671!important} /* Real back button sits at the left edge of the hero, never in its center */ #mediq-dashboard .mq-hero{position:relative!important;padding-left:122px!important} #mediq-dashboard #mqBack{position:absolute!important;left:20px!important;top:50%!important;transform:translateY(-50%)!important;margin:0!important;right:auto!important} /* Hierarchy is revealed only for the currently selected branch */ #mediq-dashboard .mq-tree-v31 .v32-tree-children{display:none!important;margin:0 0 7px!important;padding-right:12px!important} #mediq-dashboard .mq-tree-v31 .v32-tree-children.open{display:block!important} #mediq-dashboard .mq-tree-v31 .v32-tree-children .mq-tree-row.level-2{display:flex!important;min-height:35px!important;font-size:11px!important;color:rgba(255,255,255,.85)} #mediq-dashboard .mq-tree-v31 .v32-tree-children .mq-tree-row.level-2.active{background:#2b83b7!important;color:white!important} #mediq-dashboard .mq-tree-v31 .mq-tree-row.level-1[data-tree-key="logistics"]:after, #mediq-dashboard .mq-tree-v31 .mq-tree-row.level-1[data-tree-key="property"]:after{content:'⌄';margin-right:auto;color:#eaf4fa;font-size:16px} /* Compact right-to-left feature picker: no horizontal scrollbar or overflowing labels */ #mediq-dashboard .v-inline-filters{width:min(485px,calc(100vw - 35px))!important;max-height:min(490px,75vh)!important;overflow-y:auto!important;overflow-x:hidden!important;text-align:right!important;direction:rtl!important} #mediq-dashboard .v-filter-columns{grid-template-columns:minmax(0,1fr) minmax(0,1fr)!important;gap:8px!important} #mediq-dashboard .v-filter-attributes,#mediq-dashboard .v-filter-values{min-width:0!important;overflow:hidden!important} #mediq-dashboard .v-attribute-list,#mediq-dashboard .v-filter-checklist{overflow-x:hidden!important;max-width:100%!important} #mediq-dashboard .v-filter-check-option{display:flex!important;direction:rtl!important;flex-direction:row!important;justify-content:flex-start!important;align-items:center!important;gap:6px!important;text-align:right!important;padding:6px!important;min-width:0!important} #mediq-dashboard .v-filter-check-option input[type=checkbox]{order:0!important;position:static!important;flex:0 0 15px!important;width:15px!important;height:15px!important;margin:0!important} #mediq-dashboard .v-filter-check-option>span{order:1!important;flex:1 1 0!important;min-width:0!important;max-width:100%!important;overflow-wrap:anywhere!important;word-break:break-word!important;white-space:normal!important;text-align:right!important;line-height:1.7!important} #mediq-dashboard .v-attribute-choice{white-space:normal!important;overflow-wrap:anywhere!important} #mediq-dashboard #vFilterFind,#mediq-dashboard #vAttributeSearch{width:100%!important;min-width:0!important} @media(max-width:520px){#mediq-dashboard .v-filter-columns{grid-template-columns:1fr!important}#mediq-dashboard .v-inline-filters{width:min(360px,calc(100vw - 20px))!important}} /* V33 – button scope, statuses, request links and review placement */ #mediq-dashboard .mq-assets-btn.primary, #mediq-dashboard #vProcess, #mediq-dashboard #mqAssetsNew, #mediq-dashboard #vEditSave, #mediq-dashboard .v-dialog .mq-assets-btn.primary:not(#vReview):not(#vCommit){ background:#3997c8!important;border-color:#3997c8!important;color:#fff!important; } #mediq-dashboard #vReview,#mediq-dashboard #vCommit{ background:#54ae8b!important;border-color:#54ae8b!important;color:#fff!important; } #mediq-dashboard #vReview:hover,#mediq-dashboard #vCommit:hover{background:#439e7c!important;border-color:#439e7c!important;} #mediq-dashboard #vReviewBox{margin:10px 0 16px;max-width:100%;} #mediq-dashboard #vReviewBox:empty{display:none;} #mediq-dashboard #vCommit{display:inline-flex;align-items:center;justify-content:center;margin-top:10px;} #mediq-dashboard .v33-status-icon{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;width:16px;height:16px;border-radius:50%;font-size:11px;font-weight:900;margin-left:5px;} #mediq-dashboard .v33-status-icon.is-active{color:#13804a;background:#dbf4e7;border:1px solid #8dd7ab;} #mediq-dashboard .v33-status-icon.is-inactive{color:#b34c38;background:#fff0ea;border:1px solid #f0b5a5;} #mediq-dashboard .v33-status-icon.is-unknown{color:#688194;background:#eff4f6;border:1px solid #cbdce6;} #mediq-dashboard .v33-request-link{display:inline-flex;align-items:center;gap:6px;margin-top:12px;padding:7px 12px;border:1px solid #c3e0f2;border-radius:8px;background:#eff8ff;color:#176c9e!important;font-size:11px;font-weight:800;text-decoration:none!important;} #mediq-dashboard .v33-request-link:hover{background:#dff1fc;} /* V34 scoped visual fixes */ #mediq-dashboard #vProcess:hover,#mediq-dashboard #vProcess:focus-visible, #mediq-dashboard #mqAssetsNew:hover,#mediq-dashboard #mqAssetsNew:focus-visible, #mediq-dashboard .mq-assets-btn.primary:hover:not(#vReview):not(#vCommit){background:#287fae!important;border-color:#287fae!important;color:white!important;} #mediq-dashboard .mq-logo{cursor:pointer} #mediq-dashboard .mq-logo:focus-visible{outline:2px solid white;outline-offset:3px} #mediq-dashboard .mq-hero:not(:has(#mqBack[style*="inline-block"])) {padding-left:24px!important} #mediq-dashboard .mq-hero #mqBack[style*="none"]{display:none!important} #mediq-dashboard .v-inline-filters{width:min(680px,calc(100vw - 42px))!important;max-height:min(520px,78vh)!important;overflow-x:hidden!important} #mediq-dashboard .v-filter-columns{grid-template-columns:minmax(0,1fr) minmax(0,1.15fr)!important;gap:14px!important} #mediq-dashboard .v-filter-attributes,#mediq-dashboard .v-filter-values{overflow:visible!important;min-width:0!important} #mediq-dashboard .v-filter-check-option,#mediq-dashboard .v-attribute-choice{display:flex!important;flex-direction:row!important;direction:rtl!important;align-items:center!important;justify-content:flex-start!important;gap:9px!important;min-width:0!important;white-space:nowrap!important;padding:6px 8px!important} #mediq-dashboard .v-filter-check-option input[type=checkbox],#mediq-dashboard .v-attribute-choice .v-attribute-tick{position:static!important;order:0!important;display:inline-flex!important;flex:0 0 16px!important;min-width:16px!important;width:16px!important;height:16px!important;grid-column:auto!important;grid-row:auto!important;margin:0!important} #mediq-dashboard .v-filter-check-option>span,#mediq-dashboard .v-attribute-choice>span:last-child{order:1!important;display:block!important;flex:1 1 0!important;min-width:0!important;max-width:none!important;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important;word-break:normal!important;overflow-wrap:normal!important;text-align:right!important;grid-column:auto!important;grid-row:auto!important} #mediq-dashboard .v-filter-checklist,#mediq-dashboard .v-attribute-list{overflow-x:hidden!important;overflow-y:auto!important;max-width:100%!important;scrollbar-width:thin} #mediq-dashboard .v34-process-loading{min-height:170px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:22px;text-align:center;color:#366784;border:1px solid #cce2ef;border-radius:12px;background:#f4faff;font-size:13px} #mediq-dashboard .v34-process-loading small{font-size:11px;color:#61829a;line-height:1.8} #mediq-dashboard .v34-spinner{width:34px;height:34px;border:4px solid #d2eaf6;border-top-color:#258fc6;border-radius:50%;animation:v34spin .8s linear infinite} @keyframes v34spin{to{transform:rotate(360deg)}} #mediq-dashboard #vProcessFilter[aria-busy="true"]{opacity:.65;cursor:progress} @media(max-width:720px){#mediq-dashboard .v-filter-columns{grid-template-columns:1fr!important}} </style> <div class="mq-app"> <!-- ===================================================== MAIN ===================================================== --> <main class="mq-main"> <!-- HEADER --> <header class="mq-header"> <div class="mq-header-right"> <div id="mqPageTitle" class="mq-page-title" > تأمین </div> <div id="mqPageDesc" class="mq-page-description" > مدیریت فرآیند تأمین تجهیزات پزشکی </div> </div> <div class="mq-header-left"> <a id="mqEditPageBtn" class="mq-edit-page-btn" href="/pages/editpage.action?pageId=177807112" title="ویرایش صفحه داشبورد" > <svg viewBox="0 0 24 24" aria-hidden="true"> <path d="M12 20h9"></path> <path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L8 18l-4 1 1-4Z"></path> </svg> <span>ویرایش صفحه</span> </a> <div class="mq-header-welcome"> <span class="mq-welcome-dot"></span> <strong id="mqWelcomeUser">کاربر مدیکیو</strong> <span>خوش آمدید</span> </div> </div> </header> <!-- HERO --> <section class="mq-hero"> <div> <div id="mqHeroTitle" class="mq-hero-title" > مدیریت تجهیزات </div> <div id="mqHeroDesc" class="mq-hero-desc" > بخش موردنظر خود را انتخاب کنید. </div> </div> <button id="mqBack" class="mq-back-btn" type="button" > بازگشت </button> </section> <!-- BREADCRUMB --> <div id="mqBreadcrumb" class="mq-breadcrumb" ></div> <!-- DYNAMIC VIEW --> <div id="mqView" class="mq-view" > <div class="mq-section-head"> <div> <div class="mq-section-title">مدیریت تجهیزات</div> <div class="mq-section-desc">یکی از حوزههای مدیریت تجهیزات را انتخاب کنید.</div> </div> </div> <div class="mq-card-grid"> <div class="mq-module-card"> <div class="mq-module-icon"> <svg viewBox="0 0 24 24"><path d="M12 3l7 4-7 4-7-4 7-4z"></path><path d="M5 7v9l7 4 7-4V7"></path><path d="M12 11v9"></path></svg> </div> <div class="mq-module-name">مدیریت اموال</div> </div> <div class="mq-module-card"> <div class="mq-module-icon"> <svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="3"></circle><path d="M12 2v3"></path><path d="M12 19v3"></path><path d="M2 12h3"></path><path d="M19 12h3"></path></svg> </div> <div class="mq-module-name">مدیریت تعمیر و نگهداری</div> </div> <div class="mq-module-card"> <div class="mq-module-icon"> <svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"></circle><path d="M8 12h8"></path><path d="M12 8v8"></path></svg> </div> <div class="mq-module-name">مدیریت مالی و بهرهوری</div> </div> <div class="mq-module-card" data-action="logistics"> <div class="mq-module-icon"> <svg viewBox="0 0 24 24"><path d="M4 7h16"></path><path d="M6 7l1 13h10l1-13"></path><path d="M9 4h6"></path></svg> </div> <div class="mq-module-name">مدیریت تأمین و لجستیک</div> <div class="mq-module-arrow">‹</div> </div> </div> </div> </main> <!-- ===================================================== SIDEBAR ===================================================== --> <aside class="mq-sidebar"> <div class="mq-logo"> <img src="/download/attachments/174855060/MediQ%20Heart%20Medical%20Logo.png" alt="MediQ" > </div> <div class="mq-life-title"> چرخه عمر تجهیزات </div> <div class="mq-life"> <div class="mq-life-item active" data-cycle="supply" > <div class="mq-life-icon"> <svg viewBox="0 0 24 24"> <path d="M4 7h16"></path> <path d="M6 7l1 13h10l1-13"></path> <path d="M9 4h6"></path> </svg> </div> تأمین </div> <div class="mq-life-item" data-cycle="operation" > <div class="mq-life-icon"> <svg viewBox="0 0 24 24"> <circle cx="12" cy="12" r="3" ></circle> <path d="M12 3v3"></path> <path d="M12 18v3"></path> <path d="M3 12h3"></path> <path d="M18 12h3"></path> </svg> </div> بهرهبرداری </div> <div class="mq-life-item" data-cycle="replacement" > <div class="mq-life-icon"> <svg viewBox="0 0 24 24"> <path d="M4 7h11"></path> <path d="M12 4l3 3-3 3"></path> <path d="M20 17H9"></path> <path d="M12 14l-3 3 3 3"></path> </svg> </div> جایگزینی </div> <div class="mq-life-item" data-cycle="maintenance" > <div class="mq-life-icon"> <svg viewBox="0 0 24 24"> <path d="M14 6a4 4 0 0 0 4 4l-8 8-4-4 8-8z" ></path> </svg> </div> نگهداری </div> </div> <!-- MEDIQ V31 - FIVE PRIMARY NAVIGATION SECTIONS --> <nav class="mq-tree mq-tree-v31" id="mqTree" aria-label="منوی اصلی مدیکیو"> <div class="mq-tree-row level-1" data-tree-action="equipmentMaintenance" data-tree-key="equipmentMaintenance"><span class="mq-tree-dot"></span><span>مدیریت تعمیر و نگهداری</span><span class="mm-tree-arrow">▾</span></div><div class="mm-tree-children" id="mmTreeChildren"><button type="button" data-mm-tree="overview">داشبورد فعالیتها</button><button type="button" data-mm-tree="plans">برنامهریزی پیشگیرانه</button><button type="button" data-mm-tree="em">ثبت و پیگیری خرابی</button><button type="button" data-mm-tree="suppliers">تعمیرکاران</button><button type="button" data-mm-tree="costing">مدیریت هزینههای نت</button><button type="button" data-mm-tree="risk">مدیریت ریسک</button></div> <div class="mq-tree-row level-1" data-tree-action="logistics" data-tree-key="logistics"><span class="mq-tree-dot"></span><span>مدیریت تأمین و لجستیک</span></div> <div class="mq-tree-children v32-tree-children" data-tree-group="logistics"> <div class="mq-tree-row level-2" data-v32-nav="consumable"><span class="mq-tree-dot"></span><span>کالاهای مصرفی</span></div> <div class="mq-tree-row level-2" data-v32-nav="fixed"><span class="mq-tree-dot"></span><span>داراییهای ثابت</span></div> <div class="mq-tree-row level-2" data-v32-nav="suppliers"><span class="mq-tree-dot"></span><span>تأمینکنندهها</span></div> </div> <div class="mq-tree-row level-1" data-tree-action="property" data-tree-key="property"><span class="mq-tree-dot"></span><span>مدیریت اموال و داراییها</span></div> <div class="mq-tree-children v32-tree-children" data-tree-group="property"> <div class="mq-tree-row level-2" data-v32-nav="assets"><span class="mq-tree-dot"></span><span>نمای کلی داراییها</span></div> <div class="mq-tree-row level-2" data-v32-nav="handover"><span class="mq-tree-dot"></span><span>اقدامات تحویل</span></div> </div> <div class="mq-tree-row level-1" data-tree-action="finance" data-tree-key="finance"><span class="mq-tree-dot"></span><span>مدیریت مالی و بهرهوری</span></div> <div class="mq-tree-row level-1" data-tree-action="analysis" data-tree-key="analysis"><span class="mq-tree-dot"></span><span>تحلیل و آنالیز</span></div> </nav> <div class="mq-sidebar-bottom"> <div id="mqLogout" class="mq-logout" > خروج از حساب کاربری </div> </div> </aside> </div> <div id="mqWz" aria-hidden="true"> <div class="wz-dialog" role="dialog" aria-modal="true" aria-labelledby="wzTitle"> <div class="wz-head"> <div class="wz-head-top"><div class="wz-title" id="wzTitle">انتخاب گروه</div><button type="button" class="wz-close" id="wzClose" aria-label="بستن">×</button></div> <div class="wz-steps" id="wzSteps"></div> </div> <div class="wz-body" id="wzBody"></div> <div class="wz-msg" id="wzMsg" role="status"></div> <div class="wz-foot"> <div class="wz-foot-r"><button type="button" class="wz-btn" id="wzPrev">مرحله قبل</button></div> <div class="wz-foot-l"><button type="button" class="wz-btn primary" id="wzNext">مرحله بعد</button></div> </div> </div> </div> <div id="mqDetail" aria-hidden="true"> <div class="wz-dialog" role="dialog" aria-modal="true" aria-labelledby="mqDetailTitle"> <div class="wz-head"><div class="wz-head-top"><div class="wz-title" id="mqDetailTitle">جزئیات دارایی</div><button type="button" class="wz-close" id="mqDetailClose" aria-label="بستن">×</button></div></div> <div class="wz-body" id="mqDetailBody"></div> </div> </div> <div id="mqToast" class="mq-toast"></div> <style> /* V38.24: left-column accordion with standalone request action */ #mediq-dashboard #mmContent.mm-with-fixed-side{display:grid!important;grid-template-columns:minmax(260px,290px) minmax(0,1fr)!important;gap:12px!important;align-items:start!important;min-width:0!important;direction:ltr!important} #mediq-dashboard #mmContent.mm-with-fixed-side>.v-stats,#mediq-dashboard #mmContent.mm-with-fixed-side>#mmActivitiesHeading{grid-column:1 / -1!important;min-width:0!important} #mediq-dashboard #mmContent.mm-with-fixed-side>#mmPermanentIssue{float:none!important;grid-column:1!important;grid-row:3 / span 3!important;direction:rtl!important;position:sticky!important;top:12px!important;width:100%!important;min-width:0!important;max-width:100%!important;max-height:min(660px,calc(100vh - 40px))!important;overflow-y:auto!important;overflow-x:hidden!important;margin:0!important;padding:12px!important;box-sizing:border-box!important;z-index:3!important} #mediq-dashboard #mmContent.mm-with-fixed-side>.mm-actionbar{grid-column:2!important;grid-row:3!important;direction:rtl!important;margin:0!important;min-width:0!important} #mediq-dashboard #mmContent.mm-with-fixed-side>#mmRows{grid-column:2!important;grid-row:4!important;direction:rtl!important;margin:0!important;min-width:0!important;width:100%!important;overflow:auto!important} #mediq-dashboard #mmPermanentIssue .mm-detail-card{padding:0!important;margin:9px 0!important;overflow:visible!important;border-radius:12px!important;min-width:0!important} #mediq-dashboard #mmPermanentIssue .mm-accordion-toggle{appearance:none;border:0;background:#f2f8fd;border-radius:11px;padding:12px 11px;width:100%;font-family:inherit;font-size:13px;font-weight:800;color:#125d85;cursor:pointer;display:flex;align-items:center;justify-content:space-between;text-align:right;min-height:43px} #mediq-dashboard #mmPermanentIssue .mm-accordion-toggle[aria-expanded="true"]{background:#e6f4fc;color:#075b89;border-radius:11px 11px 0 0;border-bottom:1px solid #cbe5f4} #mediq-dashboard #mmPermanentIssue .mm-accordion-chevron{font-size:21px;transition:transform .2s} #mediq-dashboard #mmPermanentIssue .mm-accordion-toggle[aria-expanded="true"] .mm-accordion-chevron{transform:rotate(180deg)} #mediq-dashboard #mmPermanentIssue .mm-accordion-body{padding:11px!important;min-width:0!important;overflow-wrap:anywhere} #mediq-dashboard #mmPermanentIssue .mm-accordion-body[hidden]{display:none!important} #mediq-dashboard #mmPermanentIssue .mm-standalone-request{padding:11px!important;background:#f4faff!important;border:1px solid #c6e3f5!important} #mediq-dashboard #mmPermanentIssue .mm-standalone-request #mmShowRequest{width:100%!important;min-height:42px!important;font-weight:800!important} #mediq-dashboard #mmPermanentIssue input,#mediq-dashboard #mmPermanentIssue textarea{min-width:0!important;max-width:100%!important;box-sizing:border-box!important} #mediq-dashboard #mmPermanentIssue .mm-accordion-body .mm-stage-grid{max-width:100%!important} @media(max-width:920px){#mediq-dashboard #mmContent.mm-with-fixed-side{grid-template-columns:minmax(0,1fr)!important}#mediq-dashboard #mmContent.mm-with-fixed-side>#mmPermanentIssue{grid-column:1!important;grid-row:3!important;position:relative!important;max-height:460px!important}#mediq-dashboard #mmContent.mm-with-fixed-side>.mm-actionbar{grid-column:1!important;grid-row:4!important}#mediq-dashboard #mmContent.mm-with-fixed-side>#mmRows{grid-column:1!important;grid-row:5!important}} </style> <style> /* MEDIQ V49.8: uploaded original priority icons, embedded locally */ #mediq-dashboard .mq-real-priority-icon {display:inline-block;width:23px;height:23px;object-fit:contain;vertical-align:middle;flex:none} #mediq-dashboard .muf-priority-badge{display:inline-flex;align-items:center;gap:7px} #mediq-dashboard .muf-urgency-icon{display:inline-flex;align-items:center;justify-content:center} #mediq-dashboard .muf-urgency-icon .mq-real-priority-icon{width:22px;height:22px} #mediq-dashboard .mq-v494-icon{object-fit:contain} </style> <script> (function () { "use strict"; function mqShowFatal(msg){ try{ var d=document.getElementById("mqHeroDesc"); if(d){d.textContent="خطای اسکریپت: "+msg;d.style.color="#ffb4b4";d.style.direction="ltr";d.style.textAlign="right";} }catch(e){} } /* ============================================================ STATE ============================================================ */ var state = { cycle: "supply", screen: "equipment", selectedAssetSection: "purchased" }; /* ============================================================ ELEMENTS ============================================================ */ var view = document.getElementById( "mqView" ); var breadcrumb = document.getElementById( "mqBreadcrumb" ); var heroTitle = document.getElementById( "mqHeroTitle" ); var heroDesc = document.getElementById( "mqHeroDesc" ); var backButton = document.getElementById( "mqBack" ); var pageTitle = document.getElementById( "mqPageTitle" ); var pageDesc = document.getElementById( "mqPageDesc" ); var toast = document.getElementById( "mqToast" ); /* ============================================================ ICONS ============================================================ */ var ICONS = { "supply": "<path fill=\"#e5edf1\" stroke=\"none\" d=\"M3 8h12v10H3z\"/><path d=\"M3 8h12v10H3zM15 11h4l3 4v3h-7M19 11v4h3M7 8V4h7v4M10.5 4v4\"/><circle cx=\"7\" cy=\"19\" r=\"2\" fill=\"#fff\"/><circle cx=\"18\" cy=\"19\" r=\"2\" fill=\"#fff\"/><path d=\"M6 12h6m-3-2v4\"/>", "maintenance": "<rect x=\"2\" y=\"3\" width=\"16\" height=\"12\" rx=\"2\" fill=\"#e5edf1\"/><path d=\"M4 10h3l2-4 3 7 2-3h2M8 15v4m-4 1h9\"/><path d=\"M21 11a4 4 0 0 1-4 5l-4 5-2-2 5-5a4 4 0 0 1 5-3z\" fill=\"#fff\"/>", "property": "<rect x=\"3\" y=\"4\" width=\"14\" height=\"17\" rx=\"2\" fill=\"#e5edf1\"/><rect x=\"7\" y=\"2\" width=\"6\" height=\"4\" rx=\"1\" fill=\"#fff\"/><path d=\"M6 9h8M6 12h4M6 16h3M6 18h3\"/><path d=\"M14 11h5l3 3-7 7-5-5z\" fill=\"#fff\"/><circle cx=\"17\" cy=\"14\" r=\".8\"/>", "finance": "<path fill=\"#e5edf1\" d=\"M3 3h13v16H3z\"/><path d=\"M6 15v-4m4 4V8m4 4V5M5 7l4-3 4 1 4-3\"/><ellipse cx=\"18\" cy=\"16\" rx=\"4\" ry=\"2\" fill=\"#fff\"/><path d=\"M14 16v4c0 3 8 3 8 0v-4M14 18c0 3 8 3 8 0\"/>", "purchase": "<path d=\"M3 4h3l2 12h11l3-9H7\" fill=\"#e5edf1\"/><circle cx=\"10\" cy=\"20\" r=\"1.5\" fill=\"#fff\"/><circle cx=\"18\" cy=\"20\" r=\"1.5\" fill=\"#fff\"/><path d=\"M10 10h8m-4-3v6M3 9H1M4 12H2\"/>", "newAsset": "<path d=\"M3 8l8-4 8 4-8 4z\" fill=\"#e5edf1\"/><path d=\"M3 8v11l8 4 8-4V8M11 12v11M7 6l8 4\"/><circle cx=\"19\" cy=\"5\" r=\"4\" fill=\"#fff\"/><path d=\"M19 3v4m-2-2h4\"/>", "edit": "<rect x=\"3\" y=\"3\" width=\"13\" height=\"18\" rx=\"2\" fill=\"#e5edf1\"/><path d=\"M6 7h7M6 11h4M6 15h2\"/><path d=\"M10 18l1-4L20 5l3 3-9 9z\" fill=\"#fff\"/><path d=\"M18 7l3 3M10 18l4-1\"/>", "consumable": "<path d=\"M3 11h18v11H3z\" fill=\"#e5edf1\"/><path d=\"M8 11V4h5v7M7 4h7M8 7h5M16 11V2h4v9M16 5h4M3 15h18\"/><path d=\"M10 17h4m-2-2v6\"/>" }; /* ============================================================ TOAST ============================================================ */ var toastTimer = null; function showToast(message) { if (!toast) { return; } toast.textContent = publicMessage(message); toast.classList.add( "show" ); window.clearTimeout( toastTimer ); toastTimer = window.setTimeout( function () { toast.classList.remove( "show" ); }, 2200 ); } /* ============================================================ BREADCRUMB ============================================================ */ function buildBreadcrumb(items) { items=(items||[]).filter(function(x){return x!=='تأمین';}); if (!breadcrumb) { return; } var html = ""; items.forEach(function (item, index) { var isLast = index === items.length - 1; html += '<span class="' + (isLast ? 'mq-bread-item mq-bread-current' : 'mq-bread-item mq-bread-link') + '" data-bread-label="' + item + '">' + item + '</span>'; if (!isLast) { html += '<span class="mq-bread-separator">/</span>'; } }); breadcrumb.innerHTML = html; var links = breadcrumb.querySelectorAll('.mq-bread-link'); for (var i = 0; i < links.length; i++) { links[i].onclick = function () { var label = this.getAttribute('data-bread-label'); if (label === 'تأمین' || label === 'مدیریت تجهیزات') { renderEquipment(); } else if (label === 'مدیریت تأمین و لجستیک') { renderLogistics(); } else if (label === 'ورود دارایی جدید') { state.selectedAssetSection = 'purchased'; renderAssetSections('newAsset'); } else if (label === 'ویرایش دارایی') { renderEditAssetWorkspace(); } }; } } /* ============================================================ CARD ============================================================ */ function moduleCard( title, icon, action, clickable ) { return ( '<div class="mq-module-card" ' + ( clickable ? 'data-action="' + action + '"' : '' ) + '>' + '<div class="mq-module-icon">' + '<svg viewBox="0 0 24 24">' + icon + '</svg>' + '</div>' + '<div class="mq-module-name">' + title + '</div>' + ( clickable ? '<div class="mq-module-arrow">‹</div>' : '' ) + '</div>' ); } /* ============================================================ SCREEN : EQUIPMENT ============================================================ */ function renderEquipment() { state.screen = "equipment"; pageTitle.textContent = "تأمین"; pageDesc.textContent = "مدیریت فرآیند تأمین تجهیزات پزشکی"; heroTitle.textContent = "مدیریت تجهیزات"; heroDesc.textContent = "حوزه موردنظر را انتخاب کنید."; backButton.style.display = "none"; buildBreadcrumb( [ "تأمین", "مدیریت تجهیزات" ] ); view.innerHTML = '<div class="mq-section-head">' + '<div>' + '<div class="mq-section-title">' + 'مدیریت تجهیزات' + '</div>' + '<div class="mq-section-desc">' + 'یکی از حوزههای مدیریت تجهیزات را انتخاب کنید.' + '</div>' + '</div>' + '</div>' + '<div class="mq-card-grid">' + moduleCard( "مدیریت تأمین و لجستیک", ICONS.supply, "logistics", true ) + moduleCard( "مدیریت تعمیر و نگهداری", ICONS.maintenance, "", false ) + moduleCard( "مدیریت اموال و داراییها", ICONS.property, "", false ) + moduleCard( "مدیریت مالی و بهرهوری", ICONS.finance, "", false ) + '</div>'; bindActions(); mqTreeActivate("equipment"); } /* ============================================================ SCREEN : LOGISTICS ============================================================ */ function renderLogistics() { state.screen = "logistics"; heroTitle.textContent = "مدیریت تأمین و لجستیک"; heroDesc.textContent = "عملیات موردنظر را انتخاب کنید."; backButton.style.display = "inline-block"; buildBreadcrumb( [ "تأمین", "مدیریت تجهیزات", "مدیریت تأمین و لجستیک" ] ); view.innerHTML = '<div class="mq-section-head">' + '<div>' + '<div class="mq-section-title">' + 'مدیریت تأمین و لجستیک' + '</div>' + '<div class="mq-section-desc">' + 'عملیات مرتبط با تأمین و لجستیک تجهیزات' + '</div>' + '</div>' + '</div>' + '<div class="mq-action-grid">' + actionCard( "خرید دارایی", "فرآیند خرید دارایی", ICONS.purchase, "purchase" ) + actionCard( "ورود دارایی جدید", "ثبت و تکمیل اطلاعات دارایی جدید", ICONS.newAsset, "newAsset" ) + actionCard( "ویرایش دارایی", "مشاهده و ویرایش اطلاعات دارایی موجود", ICONS.edit, "editAsset" ) + actionCard( "کالاهای مصرفی", "مدیریت کالاهای مصرفی", ICONS.consumable, "consumable" ) + '</div>'; bindActions(); mqTreeActivate("logistics"); } function actionCard( title, subtitle, icon, action ) { return ( '<div class="mq-action-card" data-action="' + action + '">' + '<div class="mq-action-icon">' + '<svg viewBox="0 0 24 24">' + icon + '</svg>' + '</div>' + '<div>' + '<div class="mq-action-title">' + title + '</div>' + '<div class="mq-action-sub">' + subtitle + '</div>' + '</div>' + '</div>' ); } /* ============================================================ ASSET SECTION SCREEN ============================================================ */ function renderAssetSections(mode) { state.screen = mode; var isNew = mode === "newAsset"; var title = isNew ? "ورود دارایی جدید" : "ویرایش دارایی موجود"; heroTitle.textContent = title; heroDesc.textContent = isNew ? "اطلاعات موردنیاز برای ورود دارایی را انتخاب کنید." : "بخش موردنظر برای ویرایش دارایی را انتخاب کنید."; backButton.style.display = "inline-block"; buildBreadcrumb( [ "تأمین", "مدیریت تجهیزات", "مدیریت تأمین و لجستیک", title ] ); view.innerHTML = '<div class="mq-list-layout">' + '<div class="mq-list-menu">' + listOption( "purchased", "لیست داراییها" ) + listOption( "technical", "شناسنامه فنی" ) + listOption( "financial", "شناسنامه مالی" ) + listOption( "maintenance", "شناسنامه نگهداری و تعمیر" ) + listOption( "commercial", "شناسنامه بازرگانی" ) + '</div>' + '<div class="mq-preview">' + '<div id="mqPreviewContent"></div>' + '</div>' + '</div>'; bindSectionOptions(); renderPreview( state.selectedAssetSection ); mqTreeActivate(mode + "-" + state.selectedAssetSection); } function listOption( key, title ) { return ( '<div ' + 'class="mq-list-option" ' + 'data-section="' + key + '">' + '<span>' + title + '</span>' + '<span class="mq-option-badge">' + '‹' + '</span>' + '</div>' ); } /* ============================================================ PREVIEW CONTENT ============================================================ */ var SECTION_NAMES = { purchased: "لیست داراییها", technical: "شناسنامه فنی", financial: "شناسنامه مالی", maintenance: "شناسنامه نگهداری و تعمیر", commercial: "شناسنامه بازرگانی" }; /* ============================================================ SIMPLE PRESENTATION PAGES ============================================================ */ function renderSimplePage( title ) { heroTitle.textContent = title; heroDesc.textContent = "نمای پرزنت این بخش"; backButton.style.display = "inline-block"; buildBreadcrumb( [ "تأمین", "مدیریت تجهیزات", "مدیریت تأمین و لجستیک", title ] ); view.innerHTML = '<div class="mq-empty-cycle">' + '<strong>' + title + '</strong>' + '<span>' + 'این بخش در ادامه فرآیند طراحی تکمیل میشود.' + '</span>' + '</div>'; } /* ============================================================ OTHER LIFE CYCLE TABS ============================================================ */ function renderOtherCycle( key, title ) { state.cycle = key; pageTitle.textContent = title; pageDesc.textContent = "چرخه عمر تجهیزات پزشکی"; heroTitle.textContent = title; heroDesc.textContent = "نمای ساختار این بخش"; backButton.style.display = "none"; buildBreadcrumb( [ title ] ); view.innerHTML = '<div class="mq-empty-cycle">' + '<strong>' + title + '</strong>' + '<span>' + 'ساختار این بخش در مرحله بعد طراحی میشود.' + '</span>' + '</div>'; } /* ============================================================ BIND MODULE ACTIONS ============================================================ */ function bindActions() { var elements = document.querySelectorAll( "#mediq-dashboard [data-action]" ); for ( var i = 0; i < elements.length; i++ ) { elements[i].onclick = function () { var action = this.getAttribute( "data-action" ); if ( action === "logistics" ) { renderLogistics(); } else if ( action === "newAsset" ) { renderAssetSections( "newAsset" ); } else if ( action === "editAsset" ) { renderEditAssetWorkspace(); } else if ( action === "purchase" ) { renderSimplePage( "خرید دارایی" ); } else if ( action === "consumable" ) { renderSimplePage( "کالاهای مصرفی" ); } }; } } /* ============================================================ SECTION OPTIONS ============================================================ */ function bindSectionOptions() { var options = document.querySelectorAll( "#mediq-dashboard .mq-list-option" ); for ( var i = 0; i < options.length; i++ ) { options[i].onclick = function () { renderPreview( this.getAttribute( "data-section" ) ); }; } } /* ============================================================ BACK ============================================================ */ if (backButton) { backButton.onclick = function () { if ( state.screen === "logistics" ) { renderEquipment(); } else if ( state.screen === "newAsset" || state.screen === "editAsset" ) { renderLogistics(); } else if ( state.screen === "property" || state.screen === "equipmentMaintenance" || state.screen === "finance" ) { renderEquipment(); } else if ( state.screen === "purchase" || state.screen === "consumable" ) { renderLogistics(); } else { renderLogistics(); } }; } /* ============================================================ LIFE CYCLE BUTTONS ============================================================ */ var lifeItems = document.querySelectorAll( "#mediq-dashboard .mq-life-item" ); for ( var i = 0; i < lifeItems.length; i++ ) { lifeItems[i].onclick = function () { var cycle = this.getAttribute( "data-cycle" ); for ( var x = 0; x < lifeItems.length; x++ ) { lifeItems[x] .classList .remove( "active" ); } this.classList.add( "active" ); if ( cycle === "supply" ) { state.cycle = "supply"; renderEquipment(); } else if ( cycle === "operation" ) { renderOtherCycle( "operation", "بهرهبرداری" ); } else if ( cycle === "replacement" ) { renderOtherCycle( "replacement", "جایگزینی" ); } else if ( cycle === "maintenance" ) { renderOtherCycle( "maintenance", "نگهداری" ); } }; } /* ============================================================ LOGOUT ============================================================ */ var logout = document.getElementById( "mqLogout" ); if (logout) { logout.onclick = function () { window.location.href = "/logout.action"; }; } /* ============================================================ CURRENT USER / FULL NAME ============================================================ */ (function loadMediQCurrentUser() { var fallbackUser = ""; try { if (window.AJS && AJS.Meta) { fallbackUser = AJS.Meta.get("remote-user") || ""; } } catch (e) {} function setWelcomeName(name) { var welcomeUser = document.getElementById("mqWelcomeUser"); if (welcomeUser && name) { welcomeUser.textContent = name; } /* ------------------------------------------------- Edit page button - use current Confluence page id ------------------------------------------------- */ var editBtn = document.getElementById("mqEditPageBtn"); if (editBtn) { var currentPageId = ""; try { if (window.AJS && AJS.Meta) { currentPageId = AJS.Meta.get("page-id") || ""; } } catch (ignorePageMeta) {} if (!currentPageId) { try { currentPageId = new URL(window.location.href) .searchParams .get("pageId") || ""; } catch (ignorePageUrl) {} } if (currentPageId) { editBtn.href = "/pages/editpage.action?pageId=" + encodeURIComponent(currentPageId); } } } setWelcomeName(fallbackUser || "کاربر مدیکیو"); try { var xhr = new XMLHttpRequest(); xhr.open("GET", "/rest/api/user/current", true); xhr.setRequestHeader("Accept", "application/json"); xhr.onreadystatechange = function () { if (xhr.readyState !== 4 || xhr.status < 200 || xhr.status >= 300) return; try { var user = JSON.parse(xhr.responseText || "{}"); setWelcomeName(user.displayName || user.fullName || fallbackUser || "کاربر مدیکیو"); } catch (e) {} }; xhr.send(); } catch (e) {} })(); /* ============================================================ SIDEBAR TREE ============================================================ */ function mqTreeOpen(group, open) { var el = document.querySelector('#mediq-dashboard [data-tree-group="' + group + '"]'); var row = document.querySelector('#mediq-dashboard [data-tree-key="' + group + '"]'); if (el) el.classList.toggle("open", !!open); if (row) row.classList.toggle("open", !!open); } function mqTreeReset() { var rows = document.querySelectorAll("#mediq-dashboard .mq-tree-row"); for (var i = 0; i < rows.length; i++) { rows[i].classList.remove("active"); rows[i].classList.remove("parent-active"); } } function mqTreeActivate(key) { mqTreeReset(); var group=key; if(key==='newAsset'||key==='editAsset'||key==='fixed'||key==='property'||key==='newAsset-purchased'||key==='newAsset-all'||key.startsWith('newAsset-')||key.startsWith('editAsset-'))group='property'; else if(key==='consumable'||key==='suppliers'||key==='purchase'||key==='logistics')group='logistics'; else if(key==='propertyHome'||key==='propertyHandover'||key==='propertyAssets')group='property'; else if(key==='maintenance'||key==='equipmentMaintenance'||key==='costing'||key==='risk'||key==='overview'||key==='plans'||key==='em')group='equipmentMaintenance'; else if(key==='analysis')group='analysis'; var active=document.querySelector('#mediq-dashboard #mqTree [data-tree-key="'+group+'"]'); if(active)active.classList.add('active'); document.querySelectorAll('#mqTree .mq-tree-row.active').forEach(function(el){if(el!==active)el.classList.remove('active');}); var maintChildren=document.getElementById('mmTreeChildren');if(maintChildren)maintChildren.classList.toggle('open',group==='equipmentMaintenance'); var logisticsOpen=group==='logistics', propertyOpen=group==='property'; var lg=document.querySelector('#mqTree [data-tree-group="logistics"]'),pr=document.querySelector('#mqTree [data-tree-group="property"]'); if(lg)lg.classList.toggle('open',logisticsOpen); if(pr)pr.classList.toggle('open',propertyOpen); var sub=key==='propertyHandover'?'handover':key==='propertyAssets'?'assets':key==='suppliers'?'suppliers':key==='consumable'?'consumable':key==='fixed'?'fixed':null; document.querySelectorAll('#mqTree [data-v32-nav]').forEach(function(el){el.classList.toggle('active',el.getAttribute('data-v32-nav')===sub);}); } function mqTreeSimpleEquipmentPage(title, key) { state.screen = key; pageTitle.textContent = "تأمین"; pageDesc.textContent = "مدیریت فرآیند تأمین تجهیزات پزشکی"; heroTitle.textContent = title; heroDesc.textContent = "نمای پرزنت این بخش"; backButton.style.display = "inline-block"; buildBreadcrumb(["تأمین", "مدیریت تجهیزات", title]); view.innerHTML = '<div class="mq-empty-cycle">' + '<strong>' + title + '</strong>' + '<span>این بخش در ادامه فرآیند طراحی تکمیل میشود.</span>' + '</div>'; mqTreeActivate(key); } function bindTree() { var rows = document.querySelectorAll('#mediq-dashboard #mqTree [data-tree-action]'); rows.forEach(function(row){ row.onclick=function(){ var action=this.getAttribute('data-tree-action'); if(action==='equipmentMaintenance')renderMediqMaintenance(); else if(action==='logistics')renderLogistics(); else if(action==='property')mqV48PropertyHome(); else if(action==='finance')mqTreeSimpleEquipmentPage('مدیریت مالی و بهرهوری','finance'); else if(action==='analysis')vAnalysis(); }; }); } /* ============================================================ MEDIQ CODE-ONLY ENGINE (standalone) Reads/writes through ScriptRunner REST endpoints only. ============================================================ */ var CTX = ""; try { if (window.AJS && typeof AJS.contextPath === "function") CTX = AJS.contextPath() || ""; } catch (e0) {} var API = { read: CTX + "/rest/scriptrunner/latest/custom/mediqGateway", write: CTX + "/rest/scriptrunner/latest/custom/mediqGatewayWrite", pages: CTX + "/rest/scriptrunner/latest/custom/mediqEnsureAssetPages" }; var ATTR = { groupParent: 6663, titleGroup: 6668, modelTitle: 6626, manufacturer: 6627, modelType: 6629, modelGroup: 6630, groupPersian: 6683, devName: 6265, devId: 6267, assetNo: 6269, purchase: 6271, supplier: 6272, department: 6277, status: 6279, model: 6644 }; var STATUS_FA = { "active": "فعال", "inactive": "غیرفعال", "entered-in-error": "دارای خطا" }; function $id(id) { return document.getElementById(id); } function esc(v) { var amp = String.fromCharCode(38); return String(v == null ? "" : v).replace(/[&<>"']/g, function (c) { var entities = {}; entities[String.fromCharCode(38)] = amp + "amp;"; entities[String.fromCharCode(60)] = amp + "lt;"; entities[String.fromCharCode(62)] = amp + "gt;"; entities[String.fromCharCode(34)] = amp + "quot;"; entities[String.fromCharCode(39)] = amp + "#39;"; return entities[c]; }); } function clean(v) { return String(v == null ? "" : v).trim(); } function norm(v) { return clean(v).toLowerCase(); } function jfetch(url, opts) { opts = opts || {}; opts.credentials = "same-origin"; opts.headers = opts.headers || {}; opts.headers.Accept = "application/json"; return fetch(url, opts).then(function (r) { return r.text().then(function (raw) { var data = null; try { data = raw ? JSON.parse(raw) : {}; } catch (e) { data = /^\d+$/.test(clean(raw)) ? { ok: true, id: clean(raw) } : { ok: r.ok, raw: raw }; } if (!r.ok || (data && data.ok === false)) { var err = new Error((data && data.message) || ("HTTP " + r.status + (raw ? " - " + raw.slice(0, 200) : ""))); err.status = r.status; throw err; } return data || {}; }); }); } var cache = {}; var mqPendingReads = {}; function apiGet(kind, force) { if(!force && cache[kind]) return Promise.resolve(cache[kind]); if(!force && mqPendingReads[kind]) return mqPendingReads[kind]; function batch(offset,items){ return jfetch(API.read+"?kind="+encodeURIComponent(kind)+"&limit=500&offset="+offset,{method:"GET"}).then(function(x){ var next=x.items || [];items=items.concat(next); if(x.hasMore){ if(!next.length) throw new Error("دریافت فهرست کامل نشد."); return batch(offset+next.length,items); } cache[kind]=items;return items; }); } var promise=batch(0,[]); mqPendingReads[kind]=promise; var clearPending=function(){if(mqPendingReads[kind]===promise) delete mqPendingReads[kind];}; promise.then(clearPending,clearPending); return promise; } function apiWrite(op, payload) { return jfetch(API.write + "?operation=" + encodeURIComponent(op), { method: "POST", headers: { "Content-Type": "application/json; charset=UTF-8", "X-Atlassian-Token": "no-check" }, body: JSON.stringify(payload || {}) }); } function apiPages(payload) { return jfetch(API.pages, { method: "POST", headers: { "Content-Type": "application/json; charset=UTF-8", "X-Atlassian-Token": "no-check" }, body: JSON.stringify(payload || {}) }); } function attrList(row, id) { if (!row || !row.attributes) return []; var v = row.attributes[String(id)]; if (v == null) return []; return Array.isArray(v) ? v.map(String) : [String(v)]; } function attr(row, id) { var l = attrList(row, id); return l.length ? l[0] : ""; } function findRow(kind, id) { var rows = cache[kind] || []; for (var i = 0; i < rows.length; i++) if (String(rows[i].id) === String(id)) return rows[i]; return null; } function labelOf(row) { return row ? (row.label || row.key || row.id) : ""; } function groupLabel(row) { var p = attr(row, ATTR.groupPersian); return p ? (row.key ? row.key + " - " + p : p) : labelOf(row); } /* ---------------- Assets list / detail ---------------- */ function statusText(v) { v = clean(v); if (!v) return "—"; if (STATUS_FA[norm(v)]) return STATUS_FA[norm(v)]; return /^\d+$/.test(v) ? "—" : v; } var ASSET_PAGE = { page:1, size:"10", request:0 }; function filterAssetItems(items,query){ query=searchNorm(query); return items.filter(function(row){ if(!query) return true; var values=[row.key,row.label,row.id,statusText(attr(row,ATTR.status))]; Object.keys(row.attributes || {}).forEach(function(k){values=values.concat(attrList(row,k));}); return searchNorm(values.join(" ")).indexOf(query)>=0; }); } function searchNorm(value){ return latinDigits(value).replace(/ي/g,"ی").replace(/ك/g,"ک").toLowerCase().replace(/\s+/g," ").trim(); } function assetPageSlice(items,page,size){ var count=size==="all"?Math.max(items.length,1):Number(size), pages=Math.max(1,Math.ceil(items.length/count)); page=Math.min(Math.max(1,page),pages); return {items:items.slice((page-1)*count,page*count),page:page,pages:pages,start:items.length?(page-1)*count+1:0,end:Math.min(page*count,items.length)}; } function loadAssets(hostId, searchId) { var host=$id(hostId); if(!host) return; var request=++ASSET_PAGE.request; host.innerHTML='<div class="wz-loading">در حال دریافت اطلاعات داراییها...</div>'; apiGet("equipment",true).then(function(items){ if(request!==ASSET_PAGE.request || !$id(hostId)) return; var input=searchId?$id(searchId):null; function paint(){ host=$id(hostId);if(!host) return; var filtered=filterAssetItems(items,input?input.value:""), part=assetPageSlice(filtered,ASSET_PAGE.page,ASSET_PAGE.size); ASSET_PAGE.page=part.page; host.innerHTML='<div class="mq-tbl-wrap"><table class="mq-tbl"><thead><tr><th>شناسه دستگاه</th><th>نام دستگاه</th><th>شماره اموال</th><th>وضعیت</th><th>عملیات</th></tr></thead><tbody>'+part.items.map(function(o){ return '<tr><td>'+esc(attr(o,ATTR.devId)||o.key||o.id)+'</td><td>'+esc(attr(o,ATTR.devName)||o.label||"—")+'</td><td>'+esc(attr(o,ATTR.assetNo)||"—")+'</td><td>'+esc(statusText(attr(o,ATTR.status)))+'</td><td><button type="button" class="mq-assets-btn" data-detail="'+esc(o.id)+'">مشاهده</button></td></tr>'; }).join("")+(filtered.length?'':'<tr><td colspan="5">موردی یافت نشد.</td></tr>')+'</tbody></table></div>'+ '<div class="mq-list-controls"><label>تعداد نمایش <select id="mqPageSize">'+["10","20","50","all"].map(function(n){return '<option value="'+n+'"'+(n===ASSET_PAGE.size?' selected':'')+'>'+(n==="all"?'همه':n)+'</option>';}).join("")+'</select></label><span>'+part.start+' تا '+part.end+' از '+filtered.length+' نتیجه — کل داراییها: '+items.length+'</span></div>'+ '<div class="mq-list-controls"><button type="button" class="mq-assets-btn" id="mqPagePrev"'+(part.page===1?' disabled':'')+'>قبلی</button><span>صفحه '+part.page+' از '+part.pages+'</span><button type="button" class="mq-assets-btn" id="mqPageNext"'+(part.page===part.pages?' disabled':'')+'>بعدی</button></div>'; $id("mqPageSize").onchange=function(){ASSET_PAGE.size=this.value;ASSET_PAGE.page=1;paint();}; $id("mqPagePrev").onclick=function(){ASSET_PAGE.page--;paint();}; $id("mqPageNext").onclick=function(){ASSET_PAGE.page++;paint();}; } if(input)input.oninput=function(){ASSET_PAGE.page=1;paint();}; paint(); }).catch(function(e){if(request===ASSET_PAGE.request && $id(hostId))$id(hostId).innerHTML='<div class="mq-assets-message">خطا در دریافت اطلاعات: '+esc(publicMessage(e.message))+'</div>';}); } function refName(kind, id) { id = clean(id); if (!id) return "—"; var r = findRow(kind, id); return r ? labelOf(r) : id; } function openDetail(id) { var row = findRow("equipment", id); if (!row) return; var box = $id("mqDetailBody"); $id("mqDetailTitle").textContent = attr(row, ATTR.devName) || labelOf(row); box.innerHTML = '<div class="wz-loading">در حال بارگذاری...</div>'; $id("mqDetail").classList.add("open"); Promise.all([ apiGet("supplier").catch(function () { return []; }), apiGet("department"), loadExtraEquipment(), apiGet("models").catch(function () { return []; }) ]).then(function () { var data = [ ["شناسه دستگاه", attr(row, ATTR.devId)], ["نام دستگاه", attr(row, ATTR.devName)], ["مدل", refName("models", attr(row, ATTR.model))], ["شماره اموال", attr(row, ATTR.assetNo)], ["تاریخ خرید", displayJalali(attr(row, ATTR.purchase), false)], ["فروشنده", refName("supplier", attr(row, ATTR.supplier))], ["بخش بهرهبردار", refName("department", attr(row, ATTR.department))], ["وضعیت", statusText(attr(row, ATTR.status))], ["کد سامانه", row.key] ]; EQUIPMENT_FIELDS.forEach(function(f){ var values=attrList(row,f[0]); if(f[3]==="ref") values=values.map(function(x){return refName(f[4],x);}); if(f[3]==="boolean") values=values.map(function(x){return x==="true"?"بله":x==="false"?"خیر":x;}); if(f[3] === "date" || f[3] === "datetime-local") values=values.map(function(v){return displayJalali(v,f[3] === "datetime-local");}); data.push([f[2],values.join("، ")]); }); box.innerHTML = data.map(function (d) { return '<div class="dt-row"><span>' + esc(d[0]) + "</span><span>" + esc(d[1] || "—") + "</span></div>"; }).join(""); }); } function closeDetail() { $id("mqDetail").classList.remove("open"); } function renderEditAssetWorkspace() { state.selectedAssetSection = "purchased"; renderAssetSections("editAsset"); } function renderPreview(section) { state.selectedAssetSection = section; if (state.screen === "newAsset" || state.screen === "editAsset") mqTreeActivate(state.screen + "-" + section); var box = $id("mqPreviewContent"); if (!box) return; var title = SECTION_NAMES[section] || "شناسنامه"; var isNew = state.screen === "newAsset"; if (section === "purchased") { box.innerHTML = '<div class="mq-preview-title">لیست داراییها</div>' + '<div class="mq-preview-description">داراییهای ثبتشده در سامانه</div>' + '<div class="mq-assets-head">' + '<input id="mqAssetSearch" class="mq-edit-search" type="search" placeholder="جستجو در داراییها…" aria-label="جستجو در داراییها">' + '<div class="mq-assets-actions">' + '<button type="button" class="mq-assets-btn" id="mqAssetsRefresh">بهروزرسانی لیست</button>' + (isNew ? '<button type="button" class="mq-assets-btn primary" id="mqAssetsNew">ثبت دارایی جدید</button>' : "") + "</div></div>" + '<div id="mqAssetsHost" class="mq-assets-host"></div>'; var nb = $id("mqAssetsNew"); if (nb) nb.onclick = openWizard; $id("mqAssetsRefresh").onclick = function () { loadAssets("mqAssetsHost", "mqAssetSearch"); }; loadAssets("mqAssetsHost", "mqAssetSearch"); } else { box.innerHTML = '<div class="mq-preview-title">' + esc(title) + "</div>" + '<div class="mq-preview-description">این بخش در حال آمادهسازی است.</div>' + '<div class="mq-demo-box"><div class="mq-demo-icon">✓</div><div class="mq-demo-text">' + esc(title) + "</div></div>"; } var opts = document.querySelectorAll("#mediq-dashboard .mq-list-option"); for (var i = 0; i < opts.length; i++) opts[i].classList.toggle("active", opts[i].getAttribute("data-section") === section); } /* ---------------- Registration wizard ---------------- */ var W = { open: false, step: 0, busy: false, token: 0, sel: { group: "", title: "", model: "" }, draft: {} }; var STEPS = [ { key: "group", kind: "groups", noun: "گروه", filter: function (r) { return true; }, label: groupLabel }, { key: "title", kind: "titles", noun: "عنوان دستگاه", filter: function (r) { return !W.sel.group || attrList(r, ATTR.titleGroup).indexOf(String(W.sel.group)) >= 0; }, label: labelOf }, { key: "model", kind: "models", noun: "مدل", filter: function (r) { return !W.sel.title || attrList(r, ATTR.modelTitle).indexOf(String(W.sel.title)) >= 0; }, label: labelOf } ]; var STEP_NAMES = ["گروه", "عنوان دستگاه", "مدل", "دستگاه"]; function publicMessage(value){ return String(value == null ? "" : value).replace(/Jira\s*Assets?/gi,"سامانه داراییها").replace(/Confluence/gi,"سامانه مستندات").replace(/ScriptRunner/gi,"سرویس").replace(/\bAssets?\b/gi,"دارایی").replace(/\bJira\b/gi,"سامانه").replace(/جیرا|کانفلوئنس/g,"سامانه").replace(/\bEndpoint\b/gi,"سرویس"); } function wzMsg(text, isErr) { var el = $id("wzMsg"); if (!el) return; el.textContent = publicMessage(text); el.className = "wz-msg" + (isErr ? " err" : ""); } function wzBusy(flag) { W.busy = !!flag; var b = document.querySelectorAll("#mqWz button:not(.wz-close)"); for (var i = 0; i < b.length; i++) b[i].disabled = !!flag; if (!flag) wzHeader(); } function wzHeader() { $id("wzTitle").textContent = W.step === 3 ? "ثبت دستگاه" : "انتخاب " + STEP_NAMES[W.step]; $id("wzSteps").innerHTML = STEP_NAMES.map(function (n, i) { var c = i === W.step ? " active" : (i < W.step ? " done" : ""); var chosen = i < 3 ? findRow(STEPS[i].kind,W.sel[STEPS[i].key]) : null; var chosenLabel = chosen ? STEPS[i].label(chosen) : (i === 3 ? clean(W.draft.deviceId) : ""); return '<div class="wz-step' + c + '"><div class="wz-step-heading"><b>'+(i+1)+'</b><span>'+esc(n)+'</span></div><small class="wz-step-value" title="'+esc(chosenLabel)+'">'+esc(chosenLabel || "—")+'</small></div>'; }).join(""); var prev = $id("wzPrev"), next = $id("wzNext"); prev.style.visibility = W.step === 0 ? "hidden" : "visible"; next.textContent = W.step === 3 ? "ثبت دستگاه" : "مرحله بعد"; } function openWizard() { W.open = true; W.step = 0; W.busy = false; W.sel = { group: "", title: "", model: "" }; W.draft = {}; W.segment=0; $id("mqWz").classList.add("open"); $id("mqWz").setAttribute("aria-hidden", "false"); wzPaint(); } function closeWizard() { mqCloseDatePopover(); W.open = false; $id("mqWz").classList.remove("open"); $id("mqWz").setAttribute("aria-hidden", "true"); } var JALALI_FORMAT = new Intl.DateTimeFormat("en-US-u-ca-persian-nu-latn",{year:"numeric",month:"numeric",day:"numeric",timeZone:"UTC"}); var JALALI_MONTHS=["فروردین","اردیبهشت","خرداد","تیر","مرداد","شهریور","مهر","آبان","آذر","دی","بهمن","اسفند"]; function latinDigits(value){return String(value==null?"":value).replace(/[۰-۹]/g,function(c){return String(c.charCodeAt(0)-1776);}).replace(/[٠-٩]/g,function(c){return String(c.charCodeAt(0)-1632);});} function jalaliToday(){var d=new Date();return persianParts(new Date(Date.UTC(d.getFullYear(),d.getMonth(),d.getDate())));} function padDate(n){return String(n).padStart(2,"0");} function persianParts(date){var p={};JALALI_FORMAT.formatToParts(date).forEach(function(x){if(x.type!=="literal")p[x.type]=Number(x.value);});return {y:p.year,m:p.month,d:p.day};} function jalaliToISO(y,m,d){ if(y<1200 || y>1600 || m<1 || m>12 || d<1 || d>31)throw new Error("تاریخ شمسی معتبر نیست."); var low=Math.floor(Date.UTC(y+621,0,1)/86400000),high=Math.floor(Date.UTC(y+623,0,1)/86400000),target=y*10000+m*100+d; while(low<=high){var middle=Math.floor((low+high)/2),date=new Date(middle*86400000),p=persianParts(date),key=p.y*10000+p.m*100+p.d; if(key===target)return date.toISOString().slice(0,10); if(key<target)low=middle+1;else high=middle-1; } throw new Error("روز انتخابشده در این ماه وجود ندارد."); } function parseJalali(value,withTime){ var raw=latinDigits(value).trim();if(!raw)return ""; var match=raw.match(/^(\d{4})[\/\-](\d{1,2})[\/\-](\d{1,2})(?:[ T]+(\d{1,2}):(\d{2})(?::(\d{2}))?)?$/); if(!match)throw new Error(withTime?"تاریخ و ساعت را مانند ۱۴۰۵/۰۷/۲۸ ۱۴:۳۰ وارد کنید.":"تاریخ را مانند ۱۴۰۵/۰۷/۲۸ وارد کنید."); var iso=jalaliToISO(Number(match[1]),Number(match[2]),Number(match[3])); if(withTime){var hh=Number(match[4]||0),mm=Number(match[5]||0),ss=Number(match[6]||0);if(hh>23 || mm>59 || ss>59)throw new Error("ساعت معتبر نیست.");return iso+"T"+padDate(hh)+":"+padDate(mm)+":"+padDate(ss);} if(match[4]!=null)throw new Error("این فیلد فقط تاریخ میپذیرد."); return iso; } function displayJalali(value,withTime){ var raw=latinDigits(value).trim();if(!raw)return ""; var match=raw.match(/^(\d{4})[-\/](\d{1,2})[-\/](\d{1,2})(?:[ T](\d{2}):(\d{2}))?/); if(!match)return raw; if(Number(match[1])<1700)return raw.replace(/-/g,"/"); var date=new Date(Date.UTC(Number(match[1]),Number(match[2])-1,Number(match[3]))),p=persianParts(date); return p.y+"/"+padDate(p.m)+"/"+padDate(p.d)+(withTime?" "+(match[4]||"00")+":"+(match[5]||"00"):""); } function jalaliField(id,label,value,withTime,required){ return '<div class="wz-field mq-jdate"><label for="'+id+'">'+esc(label)+(required?' *':'')+'</label><div class="wz-inline"><input type="text" dir="ltr" id="'+id+'" data-jalali="'+(withTime?'time':'date')+'" value="'+esc(displayJalali(value,withTime))+'" placeholder="'+(withTime?'۱۴۰۵/۰۷/۲۸ ۱۴:۳۰':'۱۴۰۵/۰۷/۲۸')+'" autocomplete="off"><button type="button" class="wz-plus" data-jcalendar="'+id+'" aria-label="انتخاب تاریخ شمسی">▦</button></div><div class="mq-jcalendar" id="'+id+'Calendar" hidden></div></div>'; } function gregorianInput(id,withTime){var el=$id(id);return el?parseJalali(el.value,withTime):"";} function validateJalaliInputs(){ var inputs=document.querySelectorAll('#wzBody [data-jalali]'); for(var i=0;i<inputs.length;i++)try{parseJalali(inputs[i].value,inputs[i].dataset.jalali==="time");inputs[i].setCustomValidity("");}catch(e){inputs[i].setCustomValidity(e.message);revealEquipmentField(inputs[i]);inputs[i].focus();wzMsg(e.message,true);return false;} return true; } var MQ_DATE_POPOVER = null; function mqDatePopoverRect(anchor,width,height,bounds){ var gap=7,pad=10,leftEdge=bounds.left+pad,rightEdge=bounds.right-pad,topEdge=bounds.top+pad,bottomEdge=bounds.bottom-pad; var available=Math.max(1,bottomEdge-topEdge),shownHeight=Math.min(height,available); var below=bottomEdge-anchor.bottom-gap,above=anchor.top-gap-topEdge; var top=anchor.bottom+gap; if(below<shownHeight && above>=shownHeight)top=anchor.top-gap-shownHeight; // If neither side fits, overlap the fields while retaining the full calendar height. top=Math.max(topEdge,Math.min(top,bottomEdge-shownHeight)); return {left:Math.max(leftEdge,Math.min(anchor.right-width,rightEdge-width)),top:top,maxHeight:available}; } function mqPositionDatePopover(){ var active=MQ_DATE_POPOVER;if(!active)return; if(!active.anchor.isConnected || !active.box.isConnected){mqCloseDatePopover();return;} var body=active.anchor.closest("#vEditBody") || $id("wzBody"),area=body.getBoundingClientRect(); var bounds={left:Math.max(0,area.left),right:Math.min(window.innerWidth,area.right),top:Math.max(0,area.top),bottom:Math.min(window.innerHeight,area.bottom)}; var width=Math.min(330,Math.max(1,bounds.right-bounds.left-20)); active.box.style.width=width+"px"; active.box.style.maxHeight="none"; var field=active.anchor.closest(".wz-inline") || active.anchor; var rect=mqDatePopoverRect(field.getBoundingClientRect(),width,active.box.scrollHeight+2,bounds); active.box.style.left=rect.left+"px";active.box.style.top=rect.top+"px";active.box.style.maxHeight=rect.maxHeight+"px"; } function mqCloseDatePopover(){ var active=MQ_DATE_POPOVER;if(!active)return;MQ_DATE_POPOVER=null; active.box.hidden=true;active.box.classList.remove("mq-date-floating"); active.box.removeAttribute("style");active.anchor.setAttribute("aria-expanded","false"); if(active.parent.isConnected)active.parent.appendChild(active.box);else active.box.remove(); } function bindJalaliInputs(){ document.querySelectorAll('#wzBody [data-jcalendar],#vEditBody [data-jcalendar]').forEach(function(button){ button.setAttribute("aria-expanded","false");button.setAttribute("aria-controls",button.dataset.jcalendar+"Calendar"); button.onclick=function(){ var id=this.dataset.jcalendar,box=$id(id+'Calendar'),same=MQ_DATE_POPOVER && MQ_DATE_POPOVER.box===box; mqCloseDatePopover();if(same)return; var p=jalaliToday(),raw=latinDigits($id(id).value),match=raw.match(/^(\d{4})\/(\d{1,2})/); if(match && Number(match[1])>=1200 && Number(match[1])<=1600 && Number(match[2])>=1 && Number(match[2])<=12){p.y=Number(match[1]);p.m=Number(match[2]);} MQ_DATE_POPOVER={box:box,anchor:this,parent:box.parentNode}; box.classList.add("mq-date-floating");(this.closest("#vDialog") ? this.closest(".v-dialog") : $id("mqWz")).appendChild(box); box.hidden=false;this.setAttribute("aria-expanded","true"); paintJalaliCalendar(id,p.y,p.m);mqPositionDatePopover(); box.onclick=function(){if(box.hidden)mqCloseDatePopover();else mqPositionDatePopover();}; }; }); } document.addEventListener("pointerdown",function(e){var active=MQ_DATE_POPOVER;if(active && !active.box.contains(e.target) && !active.anchor.contains(e.target))mqCloseDatePopover();},true); document.addEventListener("keydown",function(e){if(e.key==="Escape" && MQ_DATE_POPOVER){mqCloseDatePopover();e.preventDefault();e.stopImmediatePropagation();}},true); document.addEventListener("scroll",function(e){var active=MQ_DATE_POPOVER;if(active && !active.box.contains(e.target))mqCloseDatePopover();},true); window.addEventListener("resize",mqPositionDatePopover); function paintJalaliCalendar(id,y,m){ var box=$id(id+'Calendar'),first=new Date(jalaliToISO(y,m,1)+"T00:00:00Z"),offset=(first.getUTCDay()+1)%7,days=m<=6?31:30; if(m===12){try{jalaliToISO(y,12,30);}catch(e){days=29;}} box.innerHTML='<div class="mq-jcal-head"><button type="button" data-month="-1">ماه قبل</button><b>'+JALALI_MONTHS[m-1]+' '+y+'</b><button type="button" data-month="1">ماه بعد</button></div><div class="mq-jcal-grid">'+["ش","ی","د","س","چ","پ","ج"].map(function(x){return '<span>'+x+'</span>';}).join("")+Array(offset).fill('<span></span>').join("")+Array.from({length:days},function(_,i){return '<button type="button" data-day="'+(i+1)+'">'+(i+1)+'</button>';}).join("")+'</div><button type="button" data-today>امروز</button> <button type="button" data-clear>پاک کردن</button>'; box.querySelectorAll('[data-month]').forEach(function(b){b.onclick=function(){var next=m+Number(this.dataset.month),year=y;if(next<1){next=12;year--;}if(next>12){next=1;year++;}if(year>=1200 && year<=1600)paintJalaliCalendar(id,year,next);};}); function select(p){var el=$id(id),time=latinDigits(el.value).match(/[ T](\d{1,2}:\d{2}(?::\d{2})?)$/);el.value=p.y+'/'+padDate(p.m)+'/'+padDate(p.d)+(el.dataset.jalali==='time'?' '+(time?time[1]:'00:00'):'');el.setCustomValidity('');box.hidden=true;el.dispatchEvent(new Event('input',{bubbles:true}));el.dispatchEvent(new Event('change',{bubbles:true}));} box.querySelectorAll('[data-day]').forEach(function(b){b.onclick=function(){select({y:y,m:m,d:Number(this.dataset.day)});};}); box.querySelector('[data-today]').onclick=function(){select(jalaliToday());}; box.querySelector('[data-clear]').onclick=function(){var el=$id(id);el.value='';el.setCustomValidity('');el.dispatchEvent(new Event('input',{bubbles:true}));el.dispatchEvent(new Event('change',{bubbles:true}));box.hidden=true;}; } function field(id, label, value, type, req) { if (type === "date" || type === "datetime-local") return jalaliField(id,label,value,type === "datetime-local",req); return '<div class="wz-field"><label for="' + id + '">' + esc(label) + (req ? " *" : "") + '</label><input id="' + id + '" type="' + (type || "text") + '" value="' + esc(value || "") + '"></div>'; } function selectOptions(rows, selected, labelFn) { return '<option value="">انتخاب کنید</option>' + rows.map(function (r) { return '<option value="' + esc(r.id) + '"' + (String(r.id) === String(selected) ? " selected" : "") + ">" + esc((labelFn || labelOf)(r)) + "</option>"; }).join(""); } function selectField(id, label, rows, selected, req, withPlus) { return '<div class="wz-field"><label for="' + id + '">' + esc(label) + (req ? " *" : "") + "</label>" + (withPlus ? '<div class="wz-inline"><select id="' + id + '">' + selectOptions(rows, selected) + '</select><button type="button" class="wz-plus" data-plus="' + id + '" title="ثبت جدید" aria-label="ثبت جدید">+</button></div>' + '<div class="wz-mini" id="' + id + 'Mini" hidden><input type="text" id="' + id + 'MiniName" placeholder="نام جدید"><button type="button" class="wz-primary" data-miniok="' + id + '">ثبت</button></div>' : '<select id="' + id + '">' + selectOptions(rows, selected) + "</select>") + "</div>"; } function wzPaint() { mqCloseDatePopover(); wzHeader(); var body = $id("wzBody"); var token = ++W.token; wzMsg(""); if (W.step === 3) return paintEquipment(token); body.innerHTML = '<div class="wz-loading">در حال دریافت اطلاعات...</div>'; var cfg = STEPS[W.step]; var need = [apiGet(cfg.kind)]; if (W.step === 0) need.push(Promise.resolve([])); Promise.all(need).then(function (v) { if (token !== W.token) return; var all = v[0], rows = all.filter(cfg.filter); var html = '<div class="wz-label">' + esc(cfg.noun) + "</div>" + '<div class="wz-selected" id="wzSel"></div>' + '<div class="wz-picker" id="wzPicker"><input class="wz-search" id="wzSearch" type="text" placeholder="جستجو..." autocomplete="off"><div class="wz-list" id="wzList"></div></div>' + '<button type="button" class="wz-link" id="wzToggle">+ ثبت ' + esc(cfg.noun) + " جدید</button>" + '<div class="wz-create" id="wzCreate" hidden>' + createHtml(cfg) + "</div>"; body.innerHTML = html; drawPicker(cfg, rows, ""); $id("wzSearch").oninput = function () { drawPicker(cfg, rows, this.value); }; $id("wzList").onclick = function (e) { var toggle=e.target.closest("[data-group-toggle]"); if(toggle){var groupId=toggle.getAttribute("data-group-toggle");GROUP_COLLAPSED[groupId]=!GROUP_COLLAPSED[groupId];drawPicker(cfg,rows,$id("wzSearch").value);return;} if(W.busy)return; var b = e.target.closest(".wz-item"); if (!b) return; W.sel[cfg.key] = b.getAttribute("data-id"); if (cfg.key === "group") { W.sel.title = ""; W.sel.model = ""; } if (cfg.key === "title") { W.sel.model = ""; } drawPicker(cfg, rows, $id("wzSearch").value); wzHeader(); }; $id("wzToggle").onclick = function () { var c = $id("wzCreate"); c.hidden = !c.hidden; if (!c.hidden) { var f = c.querySelector("input,select"); if (f) f.focus(); } }; bindCreate(cfg); }).catch(function (e) { if (token === W.token) { body.innerHTML = ""; wzMsg(e.message, true); } }); } var GROUP_COLLAPSED = {}; function groupTreeData(rows){ var byId=Object.create(null), parent=Object.create(null), children=Object.create(null), roots=[]; rows.forEach(function(r){byId[String(r.id)]=r;children[String(r.id)]=[];}); rows.forEach(function(r){ var id=String(r.id),p=attr(r,ATTR.groupParent),seen={}; while(p && byId[p] && !seen[p]){seen[p]=true;p=attr(byId[p],ATTR.groupParent);} var direct=attr(r,ATTR.groupParent); if(!direct || !byId[direct] || seen[id] || (p && seen[p]))direct=""; parent[id]=direct; if(direct)children[direct].push(r);else roots.push(r); }); return {byId:byId,parent:parent,children:children,roots:roots}; } function renderGroupTree(rows,query,selected){ var tree=groupTreeData(rows),q=searchNorm(query),keep=Object.create(null); rows.forEach(function(r){if(!q || searchNorm(groupLabel(r)).indexOf(q)>=0){var id=String(r.id),seen={};while(id && !seen[id]){seen[id]=true;keep[id]=true;id=tree.parent[id];}}}); function render(nodes){return nodes.filter(function(r){return keep[String(r.id)];}).map(function(r){ var id=String(r.id),kids=tree.children[id].filter(function(x){return keep[String(x.id)];}),closed=!q && GROUP_COLLAPSED[id],has=kids.length>0; return '<li role="treeitem" aria-selected="'+(String(selected)===id?'true':'false')+'"'+(has?' aria-expanded="'+(!closed)+'"':'')+'><div class="wz-tree-line">'+ (has?'<button type="button" class="wz-tree-toggle" data-group-toggle="'+esc(id)+'" aria-label="'+(closed?'باز کردن':'بستن')+' '+esc(groupLabel(r))+'">'+(closed?'+':'−')+'</button>':'<span class="wz-tree-spacer"></span>')+ '<button type="button" class="wz-item'+(String(selected)===id?' sel':'')+'" data-id="'+esc(id)+'">'+esc(groupLabel(r))+'</button></div>'+ (has && !closed?'<ul role="group">'+render(kids)+'</ul>':'')+'</li>'; }).join("");} var body=render(tree.roots); return body?'<ul class="wz-group-tree" role="tree" aria-label="درخت گروهها">'+body+'</ul>':'<div class="wz-empty">گروهی یافت نشد.</div>'; } function drawPicker(cfg, rows, q) { var list = $id("wzList"); if (!list) return; q = norm(q); var sel = W.sel[cfg.key], html = "", n = 0; rows.forEach(function (r) { var l = cfg.label(r); if (q && norm(l).indexOf(q) < 0) return; n++; html += '<button type="button" class="wz-item' + (String(r.id) === String(sel) ? " sel" : "") + '" data-id="' + esc(r.id) + '">' + esc(l) + "</button>"; }); list.innerHTML = cfg.key === "group" ? renderGroupTree(rows,q,sel) : n ? html : '<div class="wz-empty">' + (rows.length ? "موردی با این عبارت پیدا نشد." : "موردی برای نمایش وجود ندارد؛ از دکمهی ثبت جدید استفاده کنید.") + "</div>"; var box = $id("wzSel"), cur = findRow(cfg.kind, sel); box.className = "wz-selected" + (cur ? " has" : ""); box.textContent = cur ? "انتخابشده: " + cfg.label(cur) : "هنوز " + cfg.noun + "ی انتخاب نشده است."; } function groupParentOptions(groups){ var tree=groupTreeData(groups),out=[]; function walk(rows,path){rows.forEach(function(r){var parts=path.concat([attr(r,ATTR.groupPersian)||labelOf(r)]);out.push({id:r.id,label:parts.join(" / ")});walk(tree.children[String(r.id)],parts);});} walk(tree.roots,[]);return out; } function createHtml(cfg) { if (cfg.key === "group") { var groups = cache.groups || []; return "<strong>ثبت گروه جدید</strong>" + field("wzName", "نام گروه", "", "text", true) + selectField("wzParent", "گروه والد", groupParentOptions(groups), "", false, false) + '<button type="button" class="wz-primary" id="wzCreateBtn">ثبت و انتخاب گروه</button>'; } if (cfg.key === "title") { return "<strong>ثبت عنوان دستگاه جدید</strong>" + field("wzName", "عنوان دستگاه", "", "text", true) + '<div class="wz-static">گروه: ' + esc(groupLabel(findRow("groups", W.sel.group) || {})) + "</div>" + '<button type="button" class="wz-primary" id="wzCreateBtn">ثبت و انتخاب عنوان دستگاه</button>'; } return '<strong>ثبت مدل جدید</strong><div class="wz-loading" id="wzModelLoading">در حال بارگذاری فرم...</div><div id="wzModelForm"></div>'; } function bindCreate(cfg) { var btn = $id("wzCreateBtn"); if (cfg.key === "group" && btn) btn.onclick = createGroup; if (cfg.key === "title" && btn) btn.onclick = createTitle; var nameInput = $id("wzName"); if (nameInput) nameInput.onkeydown = function (e) { if (e.key === "Enter") { e.preventDefault(); (cfg.key === "group" ? createGroup : createTitle)(); } }; if (cfg.key === "model") loadModelForm(); } function afterCreate(kind, selKey, id, okText) { delete cache[kind]; return apiGet(kind,true).then(function(){ W.sel[selKey]=String(id); if(selKey === "group"){W.sel.title="";W.sel.model="";W.step=1;} if(selKey === "title"){W.sel.model="";W.step=2;} if(selKey !== "model")wzPaint(); else wzHeader(); }); } function createGroup() { if (W.busy) return; var name = clean($id("wzName").value); if (!name) return wzMsg("نام گروه الزامی است.", true); var parent = $id("wzParent").value, values = {}; values[String(ATTR.groupPersian)] = name; if (parent) values[String(ATTR.groupParent)] = parent; wzBusy(true); wzMsg("در حال ثبت گروه..."); apiWrite("reference", { sourceAttributeId: ATTR.modelGroup, name: name, values: values }) .then(function (r) { return afterCreate("groups", "group", r.id, "گروه ثبت شد."); }) .catch(function (e) { wzMsg(e.message, true); }) .then(function () { wzBusy(false); }); } function createTitle() { if (W.busy) return; if (!W.sel.group) return wzMsg("ابتدا گروه را انتخاب کنید.", true); var name = clean($id("wzName").value); if (!name) return wzMsg("عنوان دستگاه الزامی است.", true); var values = {}; values[String(ATTR.titleGroup)] = W.sel.group; wzBusy(true); wzMsg("در حال ثبت عنوان دستگاه..."); apiWrite("reference", { sourceAttributeId: ATTR.modelTitle, name: name, values: values }) .then(function (r) { return afterCreate("titles", "title", r.id, "عنوان دستگاه ثبت شد."); }) .catch(function (e) { wzMsg(e.message, true); }) .then(function () { wzBusy(false); }); } function loadModelForm() { Promise.all([apiGet("manufacturer"), apiGet("facility")]).then(function (v) { var host = $id("wzModelForm"); if (!host) return; var ld = $id("wzModelLoading"); if (ld) ld.parentNode.removeChild(ld); host.innerHTML = '<div class="wz-grid">' + selectField("wzManufacturer", "شرکت سازنده", v[0], "", true, true) + selectField("wzFacility", "نوع", v[1], "", false, true) + field("wzNature", "ماهیت دستگاه", "") + field("wzFunction", "کارکرد", "") + field("wzCriticality", "سطح اهمیت", "") + field("wzTechnology", "فناوری", "") + field("wzPower", "برق مصرفی", "") + field("wzWater", "آب مصرفی", "") + field("wzGas", "گاز مصرفی", "") + '<div class="wz-field"><label for="wzAvatar">آواتار مدل (PNG/JPEG، حداکثر ۲ مگابایت)</label><input type="file" id="wzAvatar" accept="image/png,image/jpeg"><img id="wzAvatarPreview" hidden style="width:80px;height:80px;object-fit:contain"></div>' + '</div><button type="button" class="wz-primary" id="wzCreateBtn">ثبت و انتخاب مدل</button>'; $id("wzAvatar").onchange = function(){ var file = this.files[0], preview = $id("wzAvatarPreview"); if (preview.dataset.url) URL.revokeObjectURL(preview.dataset.url); preview.hidden = true; if (!file) return; if (file.size > 2097152 || !/^image\/(png|jpeg)$/.test(file.type)) { this.value=""; wzMsg("تصویر PNG/JPEG تا ۲ مگابایت انتخاب کنید.",true); return; } preview.dataset.url = URL.createObjectURL(file); preview.src = preview.dataset.url; preview.hidden = false; }; $id("wzCreateBtn").onclick = createModel; bindMini(); }).catch(function (e) { wzMsg(e.message, true); }); } var MINI = { wzManufacturer: { attr: ATTR.manufacturer, kind: "manufacturer" }, wzFacility: { attr: ATTR.modelType, kind: "facility" } }; function bindMini() { var plus = document.querySelectorAll("#wzModelForm [data-plus]"); for (var i = 0; i < plus.length; i++) plus[i].onclick = function () { var id = this.getAttribute("data-plus"), m = $id(id + "Mini"); m.hidden = !m.hidden; if (!m.hidden) $id(id + "MiniName").focus(); }; var oks = document.querySelectorAll("#wzModelForm [data-miniok]"); for (var j = 0; j < oks.length; j++) oks[j].onclick = function () { miniCreate(this.getAttribute("data-miniok")); }; } function miniCreate(selId) { if (W.busy) return; var cfg = MINI[selId], name = clean($id(selId + "MiniName").value); if (!name) return wzMsg("نام را وارد کنید.", true); wzBusy(true); wzMsg("در حال ثبت..."); apiWrite("reference", { sourceAttributeId: cfg.attr, name: name, values: {} }) .then(function (r) { delete cache[cfg.kind]; return apiGet(cfg.kind, true).then(function (rows) { var s = $id(selId); s.innerHTML = selectOptions(rows, r.id); $id(selId + "MiniName").value = ""; $id(selId + "Mini").hidden = true; wzMsg("مقدار جدید ثبت و انتخاب شد."); }); }) .catch(function (e) { wzMsg(e.message, true); }) .then(function () { wzBusy(false); }); } function createModel() { if (W.busy) return; var modelName = "-", manufacturer = $id("wzManufacturer").value; if (!W.sel.title) return wzMsg("ابتدا عنوان دستگاه را انتخاب کنید.", true); if (!modelName) return wzMsg("سری / مدل دستگاه الزامی است.", true); if (!manufacturer) return wzMsg("شرکت سازنده الزامی است.", true); var payload = { modelName: modelName, deviceTitleObjectId: W.sel.title, manufacturerObjectId: manufacturer, typeObjectId: $id("wzFacility").value, groupObjectId: W.sel.group, nature: clean($id("wzNature").value), modelFunction: clean($id("wzFunction").value), criticality: clean($id("wzCriticality").value), technology: clean($id("wzTechnology").value), powerRequirement: clean($id("wzPower").value), waterRequirement: clean($id("wzWater").value), gasRequirement: clean($id("wzGas").value) }; wzBusy(true); wzMsg("در حال ثبت مدل..."); var newId = ""; readAvatarFile($id("wzAvatar")).then(function(encoded){ if(encoded) payload.avatarBase64 = encoded; return apiWrite("model", payload); }).then(function (r) { W.pageWarning = ""; W.avatarWarning = r.avatarRequested && !r.avatarSaved ? ("مدل ثبت شد؛ آواتار ذخیره نشد: " + (r.avatarError || "خطای نامشخص")) : ""; newId = String(r.id); return afterCreate("models", "model", newId, "مدل ثبت شد؛ در حال ساخت صفحه اطلاعات فنی..."); }).then(function () { wzBusy(true); return apiPages({ modelObjectId: newId, modelName: modelName, classificationName: groupLabel(findRow("groups", W.sel.group) || {}), equipmentTitleName: labelOf(findRow("titles", W.sel.title)) }).then(function () { wzMsg(W.avatarWarning || "مدل و صفحه اطلاعات فنی ثبت شدند.", !!W.avatarWarning); }).catch(function (e) { W.pageWarning = "مدل ساخته شد ولی ساخت صفحه اطلاعات فنی کامل نشد: " + e.message; }); }).then(function(){ W.step=3;wzPaint(); if(W.avatarWarning || W.pageWarning)showToast([W.avatarWarning,W.pageWarning].filter(Boolean).join("؛ ")); }).catch(function (e) { wzMsg(e.message, true); }) .then(function () { wzBusy(false); }); } function readAvatarFile(input) { return new Promise(function(resolve,reject){ var file=input && input.files && input.files[0]; if(!file) return resolve(""); if(file.size>2097152 || !/^image\/(png|jpeg)$/.test(file.type)) return reject(new Error("تصویر PNG/JPEG تا ۲ مگابایت انتخاب کنید.")); var reader=new FileReader(); reader.onerror=function(){reject(new Error("خواندن تصویر ناموفق بود."));}; reader.onload=function(){resolve(String(reader.result).split(",")[1]);}; reader.readAsDataURL(file); }); } var EQUIPMENT_FIELDS = [[6268, "serialNumber", "شماره سریال", "text"], [6273, "purchaseValueRial", "ارزش ریالی خرید", "number"], [6274, "purchaseValueDollar", "ارزش دلاری خرید", "number"], [6275, "manufactureDate", "تاریخ تولید", "date"], [6276, "expiryDate", "تاریخ انقضا", "date"], [6392, "ownerDepartmentObjectId", "بخش (مالک)", "ref", "ownerDepartment"], [6280, "availability", "وضعیت دسترسی", "select"], [6281, "statusReason", "علت وضعیت فعلی", "text"], [6282, "responsibleObjectId", "مسئول بهرهبرداری", "ref", "responsible"], [6283, "recipientObjectId", "تحویلگیرنده", "ref", "recipient"], [6284, "accessoriesObjectIds", "متعلقات", "ref", "accessories"], [6285, "assembly", "نحوه ترکیب اجزا", "select"], [6286, "externalOutput", "آیا خروجی این جزء دستگاه ترکیبی ساقط میشود؟", "boolean"], [6400, "combinedFunction", "عملکرد در مجموعههای ترکیبی", "text"], [6287, "aggregateValue", "ارزش ریالی/دلاری تجمیع", "text"], [6288, "priority", "اولویت", "select"], [6289, "emergency", "فوریت", "select"], [6290, "portable", "قابل حمل", "boolean"], [6402, "portability", "قابلیت حمل", "text"], [6291, "clinicalUse", "کاربرد بالینی", "select"], [6365, "entryDateTime", "زمان ورود", "datetime-local"], [6390, "exitDateTime", "زمان خروج", "datetime-local"], [6396, "ownerCompanyObjectId", "مرکز (مالک)", "ref", "ownerCompany"], [6649, "installationDate", "تاریخ نصب", "date"], [6671, "repairCost", "هزینه تعمیرات", "text"], [6672, "downtimeDays", "روز خواب", "text"]]; var equipmentMetadata = {}; function loadExtraEquipment(){ return jfetch(API.read+"?kind=metadata").then(function(r){ equipmentMetadata = {}; ((r.metadata.equipment || {}).attributes || []).forEach(function(a){equipmentMetadata[String(a.id)]=a;}); return Promise.all(EQUIPMENT_FIELDS.filter(function(f){return f[3]==="ref";}).map(function(f){return apiGet(f[4]);})); }); } function optionCaption(value){ var key=String(value).toLowerCase(); var names={active:"فعال",inactive:"غیرفعال","entered-in-error":"دارای خطا",lost:"گم شده",damaged:"آسیب دیده",destroyed:"از بین رفته",available:"در دسترس",high:"زیاد",medium:"متوسط",low:"کم",critical:"بحرانی",urgent:"فوری",normal:"عادی",routine:"معمول",emergency:"اورژانسی",portable:"قابل حمل",fixed:"ثابت",yes:"بله",no:"خیر"}; return names[key] || value; } function extraEquipmentHtml(draft,onlyIds){ return EQUIPMENT_FIELDS.filter(function(f){return !onlyIds || onlyIds.indexOf(f[0])>=0;}).map(function(f){ var id="wzExtra"+f[0], m=equipmentMetadata[String(f[0])] || {}, value=draft[f[1]], rows; if(f[3]==="ref") rows=cache[f[4]] || []; if(f[3]==="boolean") rows=[{id:"true",label:"بله"},{id:"false",label:"خیر"}]; if(f[3]==="select") rows=f[0]===6280?v33AccessOptions(m):String(m.options || "").split(/[,;\r\n]+/).map(function(x){return x.trim();}).filter(Boolean).map(function(x){return {id:x,label:optionCaption(x)};}); if(rows){ var multi=f[3]==="ref" && (Number(m.maximumCardinality)>1 || Number(m.maximumCardinality)===-1); var chosen=Array.isArray(value)?value.map(String):[String(value==null?"":value)]; return '<div class="wz-field"><label for="'+id+'">'+esc(f[2])+'</label><select id="'+id+'"'+(multi?' multiple size="4"':'')+'>'+(!multi?'<option value="">'+(f[3]==="select" && !rows.length ? 'گزینهای برای این فیلد تعریف نشده' : 'انتخاب کنید')+'</option>':'')+rows.map(function(r){return '<option value="'+esc(r.id)+'"'+(chosen.indexOf(String(r.id))>=0?' selected':'')+'>'+esc(labelOf(r))+'</option>';}).join("")+'</select></div>'; } return field(id,f[2],value,f[3],Number(m.minimumCardinality)>0); }).join(""); } function extraEquipmentValue(f){ var el=$id("wzExtra"+f[0]); if(!el) return ""; if(el.multiple) return Array.prototype.filter.call(el.options,function(x){return x.selected;}).map(function(x){return x.value;}); return (f[3] === "date" || f[3] === "datetime-local") ? gregorianInput(el.id, f[3] === "datetime-local") : el.value; } function bindExtraEquipment(){ EQUIPMENT_FIELDS.forEach(function(f){ var el=$id("wzExtra"+f[0]); if(f[3]==="number") el.step="any"; el.oninput=el.onchange=function(){W.draft[f[1]]=(f[3] === "date" || f[3] === "datetime-local") ? el.value : extraEquipmentValue(f);}; }); } function selectEquipmentSegment(index){ mqCloseDatePopover(); W.segment=Number(index); document.querySelectorAll("#wzBody [data-equipment-panel]").forEach(function(panel){panel.hidden=Number(panel.dataset.equipmentPanel)!==W.segment;}); document.querySelectorAll("#wzBody [data-equipment-tab]").forEach(function(button){var active=Number(button.dataset.equipmentTab)===W.segment;button.classList.toggle("active",active);button.setAttribute("aria-pressed",String(active));}); } function bindEquipmentSegments(){ var body=$id("wzBody"), panels=body.querySelectorAll("[data-equipment-panel]"),nav=document.createElement("div"); nav.className="wz-segment-tabs";nav.setAttribute("role","group");nav.setAttribute("aria-label","بخشهای اطلاعات دارایی"); nav.innerHTML=Array.prototype.map.call(panels,function(panel,i){return '<button type="button" data-equipment-tab="'+i+'">'+esc(panel.querySelector("legend").textContent)+'</button>';}).join(""); body.insertBefore(nav,panels[0]); nav.onclick=function(e){var b=e.target.closest("[data-equipment-tab]");if(b && !W.busy)selectEquipmentSegment(b.dataset.equipmentTab);}; selectEquipmentSegment(W.segment || 0); } function revealEquipmentField(el){var panel=el.closest("[data-equipment-panel]");if(panel)selectEquipmentSegment(panel.dataset.equipmentPanel);} function paintEquipment(token) { var body = $id("wzBody"); body.innerHTML = '<div class="wz-loading">در حال دریافت اطلاعات...</div>'; Promise.all([ apiGet("models"), apiGet("supplier").catch(function () { return []; }), apiGet("department"), loadExtraEquipment() ]).then(function (v) { if (token !== W.token) return; var d = W.draft; var statusRows = Object.keys(STATUS_FA).map(function (k) { return { id: k, label: STATUS_FA[k] }; }); var segmentCounter=0; function segment(title,body){segmentCounter++;return '<fieldset class="wz-segment" data-equipment-panel="'+(segmentCounter-1)+'"><legend>'+esc(title)+'</legend><div class="wz-grid">'+body+'</div></fieldset>';} body.innerHTML = '<div class="wz-static">مدل انتخابشده: '+esc(labelOf(findRow("models",W.sel.model)) || "—")+'</div>'+ segment("مشخصات پایه",field("wzDevId","شناسه دستگاه",d.deviceId,"text",true)+field("wzAssetNo","شماره اموال",d.assetNumber)+extraEquipmentHtml(d,[6268]))+ segment("مشخصات فنی و اجزا",extraEquipmentHtml(d,[6284,6285,6286,6400,6290,6402,6291]))+ segment("اطلاعات مالی و خرید",field("wzPurchase","تاریخ خرید",d.purchaseDate,"date")+selectField("wzSupplier","فروشنده",v[1],d.supplierObjectId,false,false)+extraEquipmentHtml(d,[6273,6274,6287,6671]))+ segment("موقعیت و مسئولان",selectField("wzDept","بخش بهرهبردار",v[2],d.departmentObjectId,false,false)+extraEquipmentHtml(d,[6392,6282,6283,6396]))+ segment("وضعیت و تاریخها",selectField("wzStatus","وضعیت",statusRows,d.status,false,false)+extraEquipmentHtml(d,[6280,6281,6288,6289,6275,6276,6365,6390,6649,6672])); var ids = ["wzDevId", "wzAssetNo", "wzPurchase", "wzSupplier", "wzDept", "wzStatus"]; var keys = ["deviceId", "assetNumber", "purchaseDate", "supplierObjectId", "departmentObjectId", "status"]; ids.forEach(function (id, i) { var el = $id(id); var save = function () { W.draft[keys[i]] = el.value; if(id === "wzDevId")wzHeader(); }; el.oninput = save; el.onchange = save; }); bindEquipmentSegments(); bindExtraEquipment(); bindJalaliInputs(); $id("wzDevId").focus(); }).catch(function (e) { if (token === W.token) { body.innerHTML = ""; wzMsg(e.message, true); } }); } function saveEquipment() { if (W.busy) return; if (!W.sel.model) return wzMsg("مدل انتخاب نشده است.", true); if (!validateJalaliInputs()) return; var p = { modelObjectId: W.sel.model, deviceName: "دارایی " + clean($id("wzDevId").value), deviceId: clean($id("wzDevId").value), assetNumber: clean($id("wzAssetNo").value), purchaseDate: gregorianInput("wzPurchase", false), supplierObjectId: $id("wzSupplier").value, departmentObjectId: $id("wzDept").value, status: $id("wzStatus").value }; EQUIPMENT_FIELDS.forEach(function(f){p[f[1]] = extraEquipmentValue(f);}); if (!p.deviceId) { revealEquipmentField($id("wzDevId"));$id("wzDevId").focus();return wzMsg("شناسه دستگاه الزامی است.", true); } wzBusy(true); wzMsg("در حال ثبت دستگاه..."); apiWrite("equipment", p).then(function (r) { wzMsg("دستگاه ثبت شد؛ در حال ساخت صفحه..."); return apiPages({ modelObjectId: W.sel.model, modelName: labelOf(findRow("models", W.sel.model)), assetObjectId: r.id, deviceName: p.deviceName, deviceId: p.deviceId, classificationName: groupLabel(findRow("groups", W.sel.group) || {}), equipmentTitleName: labelOf(findRow("titles", W.sel.title)) }).then(function () { return true; }, function (e) { showToast("دستگاه ساخته شد ولی ساخت صفحه خطا داد: " + e.message); return true; }); }).then(function () { delete cache.equipment; closeWizard(); showToast("دستگاه با موفقیت ثبت شد."); if ($id("mqAssetsHost")) loadAssets("mqAssetsHost", "mqAssetSearch"); }).catch(function (e) { wzMsg(e.message, true); }) .then(function () { wzBusy(false); }); } function wzNext() { if (W.busy) return; if (W.step < 3) { var cfg = STEPS[W.step]; if (!W.sel[cfg.key]) return wzMsg("ابتدا " + cfg.noun + " را انتخاب کنید.", true); W.step++; return wzPaint(); } saveEquipment(); } function wzPrev() { if (W.busy || W.step === 0) return; W.step--; wzPaint(); } $id("wzNext").onclick = wzNext; $id("wzPrev").onclick = wzPrev; $id("wzClose").onclick = closeWizard; $id("mqWz").addEventListener("mousedown", function (e) { if (e.target === this) closeWizard(); }); $id("mqDetailClose").onclick = closeDetail; $id("mqDetail").addEventListener("mousedown", function (e) { if (e.target === this) closeDetail(); }); document.addEventListener("click", function (e) { var b = e.target.closest ? e.target.closest("[data-detail]") : null; if (b) openDetail(b.getAttribute("data-detail")); }); document.addEventListener("keydown", function (e) { if (e.key !== "Escape") return; if ($id("mqDetail").classList.contains("open")) closeDetail(); else if (W.open && !W.busy) closeWizard(); }); window.MEDIQ = { version: "V14_ASSET_DASHBOARD", openWizard: openWizard, refresh: function () { loadAssets("mqAssetsHost", "mqAssetSearch"); } }; /* V11: operations interface. All current registration code is preserved. */ var V11={selected:{},states:{},attrs:{department:6277,responsible:6282,status:6279,availability:6280,location:0},ready:false,missing:[],filters:[],searchFields:[],row:null,request:0}; var OP_NAMES={handover:'تحویل و تحول کاربری',entry:'ورود دارایی به انبار',exit:'خروج دارایی از انبار',scrap:'اسقاط دارایی'}; function operations(p){return apiWrite('lifecycle',p);} function vError(e){return publicMessage(e && e.message || e);} function vRef(kind,row,aid){var ids=attrList(row,aid);return ids.map(function(id){return labelOf(findRow(kind,id))||id;}).join('، ')||'—';} function vValues(row,key){ if(key==='key')return [row.key||'']; if(key==='label')return [row.label||'']; var raw=attrList(row,key),field=EQUIPMENT_FIELDS.find(function(f){return String(f[0])===String(key);}); var kind=String(key)==='6277'?'department':String(key)==='6644'?'models':field&&field[3]==='ref'?field[4]:null; if(kind)raw=raw.concat(attrList(row,key).map(function(id){return labelOf(findRow(kind,id));})); return raw.map(function(x){return optionCaption(x);}); } function vFilter(items,query){ var q=searchNorm(query); return items.filter(function(row){ var all=V11.searchFields.length?[]:[row.key,row.label];(V11.searchFields.length?V11.searchFields:Object.keys(row.attributes||{})).forEach(function(k){all=all.concat(vValues(row,k));}); if(q && searchNorm(all.join(' ')).indexOf(q)<0)return false; var grouped={}; V11.filters.forEach(function(f){(grouped[String(f.key)]||(grouped[String(f.key)]=[])).push(f);}); return Object.keys(grouped).every(function(key){ var vals=vValues(row,key).map(searchNorm); return grouped[key].some(function(f){ var wanted=searchNorm(f.value); if(f.op==='empty')return !attrList(row,key).length; if(f.op==='eq')return vals.some(function(v){return v===wanted;}); if(f.op==='ne')return !vals.some(function(v){return v===wanted;}); return vals.some(function(v){return v.indexOf(wanted)>=0;}); }); }); }); } function vReadStates(ids){ return operations({action:'state',ids:ids}).then(function(r){V11.ready=r.ready;V11.missing=r.missing||[];Object.keys(r.states||{}).forEach(function(id){V11.states[id]=Object.assign({checked:true},r.states[id]);});Object.assign(V11.attrs,r.attributes||{});return r;}); } function vState(row){return V11.states[String(row.id)]||{};} function vPanel(id){ var row=findRow('equipment',id),box=$id('v11Summary');if(!row||!box)return; V11.row=String(id);var s=vState(row),a=V11.attrs; var data=[['مسئول بهرهبردار',vRef('responsible',row,a.responsible)],['بخش بهرهبردار',vRef('department',row,a.department)],['موقعیت فعلی',a.location?vRef('location',row,a.location):'نیازمند تنظیم شناسه موقعیت'],['وضعیت',statusText(attr(row,a.status))],['وضعیت دسترسی',vAccessLabel(attr(row,a.availability))],['وضعیت اموالداری',s.active?(s.conflict?'چند فرایند فعال؛ نیازمند بررسی':'در حال '+(OP_NAMES[s.operation]||'پردازش')):s.checked?'پایدار':'در حال بررسی']]; box.innerHTML='<strong>'+esc(attr(row,ATTR.devName)||row.label)+'</strong>'+data.map(function(d){return '<div class="v-summary-row"><span>'+esc(d[0])+'</span><b>'+(d[0]==='وضعیت'?vStatusMark(attr(row,a.status)):'')+esc(d[1])+'</b></div>';}).join(''); if(s.active){ var stages=s.stages||[],at=stages.findIndex(function(x){return String(x.id)===String(s.statusId);}); box.innerHTML+='<h4>روند فرایند</h4><div class="v-steps">'+stages.map(function(x,i){return '<div class="'+(i===at?'current':i<at&&at>=0?'passed':'')+'">'+esc(x.name)+'</div>';}).join('')+'</div><p>'+esc(s.issueKey)+' — '+esc(s.statusName)+'</p>'; if(!stages.length||at<0)box.innerHTML+='<p>مرحلهٔ جاری در مسیر تنظیمشده نیست؛ وضعیت واقعی بالا نمایش داده شده است.</p>'; } } function loadAssets(hostId,searchId){ var host=$id(hostId);if(!host)return;var ticket=++V11.request; host.innerHTML='<div class="wz-loading">در حال دریافت داراییها…</div>'; Promise.all([apiGet('equipment'),apiGet('department'),apiGet('responsible')]).then(function(results){ Promise.all([apiGet('models'),apiGet('location'),loadExtraEquipment()]).catch(function(e){if(window.console)console.warn('MediQ auxiliary data:',e);}); if(ticket!==V11.request||!$id(hostId))return; var rows=results[0],input=$id(searchId);vRenderStatusDashboard(rows); function paint(){ host=$id(hostId);if(!host||ticket!==V11.request)return; var processEl=$id('vProcessFilter'),processValue=processEl?processEl.value:''; var filtered=vFilter(rows,input?input.value:'').filter(function(row){return (V14_STATUS.filter==='all'||vAssetStatusGroup(row)===V14_STATUS.filter)&&(!processValue||(vState(row).checked&&vState(row).active&&String(vState(row).operation)===processValue));}),part=assetPageSlice(filtered,ASSET_PAGE.page,ASSET_PAGE.size);ASSET_PAGE.page=part.page; host.innerHTML='<div class="mq-tbl-wrap"><table class="mq-tbl"><thead><tr><th>انتخاب</th><th>شناسه دستگاه</th><th>نام دستگاه</th><th>بخش بهرهبردار</th><th>مسئول بهرهبردار</th><th>وضعیت</th><th>عملیات</th></tr></thead><tbody>'+part.items.map(function(row){var s=vState(row);return '<tr data-vrow="'+esc(row.id)+'"><td><input type="checkbox" data-vselect="'+esc(row.id)+'" aria-label="انتخاب '+esc(row.label)+'" '+(V11.selected[row.id]?'checked ':'')+(s.active?'disabled ':'')+'></td><td>'+esc(attr(row,ATTR.devId)||row.key)+'</td><td>'+esc(attr(row,ATTR.devName)||row.label)+'</td><td><span class="v-tag purple">'+esc(vRef('department',row,6277))+'</span></td><td><span class="v-tag orange">'+esc(vRef('responsible',row,6282))+'</span></td><td><span class="v-status-pill '+vAssetStatusGroup(row)+'">'+vStatusMark(attr(row,ATTR.status))+esc(statusText(attr(row,ATTR.status)))+'</span>'+(s.active?'<small class="v-active">'+esc(OP_NAMES[s.operation]||'فرایند فعال')+'</small>':'')+'</td><td><div class="v-row-actions"><button type="button" class="mq-assets-btn" data-detail="'+esc(row.id)+'"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M2 12s4-7 10-7 10 7 10 7-4 7-10 7S2 12 2 12Z"/><circle cx="12" cy="12" r="3"/></svg>مشاهده</button><button type="button" class="mq-assets-btn" data-vedit="'+esc(row.id)+'" '+(s.active||!s.checked?'disabled':'')+'><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m15 4 5 5M4 20l5-1L20 8a2 2 0 0 0-5-5L4 14Z"/></svg>ویرایش</button></div></td></tr>';}).join('')+(filtered.length?'':'<tr><td colspan="7">موردی یافت نشد.</td></tr>')+'</tbody></table></div><div class="mq-list-controls"><label>تعداد نمایش <select id="vPageSize">'+['10','20','50','all'].map(function(n){return '<option value="'+n+'" '+(ASSET_PAGE.size===n?'selected':'')+'>'+(n==='all'?'همه':n)+'</option>';}).join('')+'</select></label><span>'+part.start+' تا '+part.end+' از '+filtered.length+' — انتخابشده: '+Object.keys(V11.selected).length+'</span></div><div class="mq-list-controls"><button class="mq-assets-btn" id="vPrev" '+(part.page===1?'disabled':'')+'>قبلی</button><span>صفحه '+part.page+' از '+part.pages+'</span><button class="mq-assets-btn" id="vNext" '+(part.page===part.pages?'disabled':'')+'>بعدی</button></div>'; $id('vPageSize').onchange=function(){ASSET_PAGE.size=this.value;ASSET_PAGE.page=1;paint();};$id('vPrev').onclick=function(){ASSET_PAGE.page--;paint();};$id('vNext').onclick=function(){ASSET_PAGE.page++;paint();}; host.querySelectorAll('[data-vselect]').forEach(function(b){b.onchange=function(){if(b.checked)V11.selected[b.dataset.vselect]=true;else delete V11.selected[b.dataset.vselect];paint();};}); host.querySelectorAll('[data-vrow]').forEach(function(tr){tr.onclick=function(){vPanel(tr.dataset.vrow);};}); host.querySelectorAll('[data-vedit]').forEach(function(b){b.onclick=function(){vEdit(b.dataset.vedit);};}); if(V11.row)vPanel(V11.row); // Lazy status checks: one request per at most 50 rows, cached until refresh. var unknown=part.items.filter(function(r){return !vState(r).checked;}).map(function(r){return String(r.id);}); if(unknown.length){ var groups=[];for(var i=0;i<unknown.length;i+=50)groups.push(unknown.slice(i,i+50)); groups.reduce(function(p,ids){return p.then(function(){return vReadStates(ids).then(function(r){ids.forEach(function(id){V11.states[id]=Object.assign({checked:true},r.states[id]);if(V11.states[id].active)delete V11.selected[id];});});});},Promise.resolve()).then(function(){if(ticket===V11.request)paint();}).catch(function(e){var warn=$id('vService');if(warn)warn.textContent='وضعیت فرایندها دریافت نشد: '+vError(e);}); } } if(input)input.oninput=function(){ASSET_PAGE.page=1;paint();};V11.paint=paint;paint(); }).catch(function(e){if(ticket===V11.request&&$id(hostId))host.innerHTML='<p>'+esc(vError(e))+'</p>';}); } function vSearch(){ // Attribute -> actual values, fetched from the complete Assets data already loaded. var defs=[{id:'key',name:'کد دارایی'},{id:'label',name:'نام دستگاه'}]; Object.keys(equipmentMetadata).forEach(function(k){ var a=equipmentMetadata[k]; if([6270,6366,6401].indexOf(Number(k))<0)defs.push({id:k,name:publicMessage((EQUIPMENT_FIELDS.find(function(f){return String(f[0])===k;})||[])[2]||({'6265':'نام دستگاه','6267':'شناسه دستگاه','6269':'شماره اموال','6277':'بخش بهرهبردار','6279':'وضعیت','6644':'مدل دستگاه'})[k]||a.name)}); }); var old=$id('vInlineFilters'); if(old){old.remove();return;} var button=$id('vFilters');if(!button)return; var anchor=button.parentNode; anchor.classList.add('v-filter-anchor'); var panel=document.createElement('div');panel.id='vInlineFilters';panel.className='v-inline-filters'; panel.innerHTML='<div class="v-filter-top"><strong>فیلتر ویژگیها</strong><button type="button" id="vFilterClose" aria-label="بستن">×</button></div>'+ '<div class="v-filter-columns"><div class="v-filter-attributes"><input type="search" id="vAttributeSearch" placeholder="جستوجوی ویژگی…" autocomplete="off"><div id="vAttributeList" class="v-attribute-list"></div></div>'+ '<div class="v-filter-values"><select id="vFilterKey" hidden><option value="">انتخاب ویژگی</option>'+defs.map(function(a){return '<option value="'+esc(a.id)+'">'+esc(a.name)+'</option>';}).join('')+'</select>'+ '<div id="vFilterDetails" hidden><label for="vFilterOp">شرط فیلتر</label><select id="vFilterOp"><option value="eq">برابر باشد</option><option value="ne">برابر نباشد</option><option value="contains">شامل باشد</option><option value="empty">خالی باشد</option></select><label for="vFilterValue">مقدار ویژگی</label><input type="search" id="vFilterFind" placeholder="جستوجو در مقادیر…" autocomplete="off"><div id="vFilterValue" class="v-filter-checklist" role="group" aria-label="مقادیر ویژگی"></div><small id="vFilterCount"></small></div><p id="vFilterPickHint">یک ویژگی را از فهرست انتخاب کنید.</p></div></div>'; anchor.appendChild(panel); $id('vFilterClose').onclick=function(){panel.remove();}; var attributeSearch=$id('vAttributeSearch'); function paintAttributes(){ var q=searchNorm(attributeSearch.value); $id('vAttributeList').innerHTML=defs.filter(function(a){return !q||searchNorm(a.name).indexOf(q)>=0;}).map(function(a){ var current=String($id('vFilterKey').value)===String(a.id); var selected=V11.filters.some(function(f){return String(f.key)===String(a.id);}); return '<button type="button" class="v-attribute-choice'+(current?' v-attribute-current':'')+'" data-attribute="'+esc(a.id)+'" aria-pressed="'+(selected?'true':'false')+'"><span class="v-attribute-tick" aria-hidden="true">'+(selected?'✓':'')+'</span><span>'+esc(a.name)+'</span></button>'; }).join('')||'<p>ویژگی پیدا نشد.</p>'; $id('vAttributeList').querySelectorAll('[data-attribute]').forEach(function(b){b.onclick=function(){var sel=$id('vFilterKey');sel.value=b.getAttribute('data-attribute');sel.onchange();paintAttributes();$id('vFilterPickHint').hidden=true;};}); } attributeSearch.oninput=paintAttributes;paintAttributes(); var keyEl=$id('vFilterKey'),opEl=$id('vFilterOp'),valueEl=$id('vFilterValue'),findEl=$id('vFilterFind'); var choices=[]; function valuesFor(key){ var found=Object.create(null),all=[]; (cache.equipment||[]).forEach(function(row){ vValues(row,key).forEach(function(raw){ var display=String(raw==null?'':raw).trim(); if(!display)return; var norm=searchNorm(display); if(!found[norm]){found[norm]=true;all.push(display);} }); }); var meta=equipmentMetadata[String(key)]||{}; String(meta.options||'').split(/[,;\r\n]+/).forEach(function(v){ v=v.trim();if(!v)return;var text=String(optionCaption(v)),norm=searchNorm(text); if(!found[norm]){found[norm]=true;all.push(text);} }); return all.sort(function(a,b){return a.localeCompare(b,'fa',{numeric:true});}); } function repaintTable(){ASSET_PAGE.page=1;if(V11.paint)V11.paint();} function paintChoices(){ var q=searchNorm(findEl.value),matched=choices.filter(function(x){return !q||searchNorm(x).indexOf(q)>=0;}),shown=matched.slice(0,120); var key=keyEl.value,op=opEl.value; valueEl.innerHTML=shown.map(function(x){ var checked=V11.filters.some(function(f){return String(f.key)===String(key)&&f.op===op&&String(f.value)===String(x);}); return '<label class="v-filter-check-option"><input type="checkbox" data-filter-value="'+esc(x)+'" '+(checked?'checked':'')+' '+(op==='empty'?'disabled':'')+'><span>'+esc(x)+'</span></label>'; }).join('')||'<p class="v-filter-empty">مقداری پیدا نشد.</p>'; $id('vFilterCount').textContent=matched.length+' مقدار منطبق'+(matched.length>120?' — ۱۲۰ مورد اول نمایش داده شده؛ برای محدودکردن جستوجو کن':''); findEl.disabled=op==='empty'; valueEl.querySelectorAll('[data-filter-value]').forEach(function(cb){cb.onchange=function(){ var value=this.getAttribute('data-filter-value'); V11.filters=V11.filters.filter(function(f){return !(String(f.key)===String(key)&&String(f.value)===value);}); if(this.checked)V11.filters.push({key:key,op:op,value:value}); repaintTable(); paintAttributes(); };}); } keyEl.onchange=function(){ var key=keyEl.value,detail=$id('vFilterDetails');detail.hidden=!key; if(!key)return; findEl.value=''; var remembered=V11.filters.find(function(f){return String(f.key)===String(key);}); opEl.value=remembered?remembered.op:'eq'; choices=valuesFor(key);paintChoices(); }; opEl.onchange=function(){ var key=keyEl.value,op=opEl.value; if(op==='empty'){ V11.filters=V11.filters.filter(function(f){return String(f.key)!==String(key);}); V11.filters.push({key:key,op:'empty',value:''}); repaintTable(); }else{ V11.filters=V11.filters.filter(function(f){return !(String(f.key)===String(key)&&f.op==='empty');}); repaintTable(); } paintChoices(); paintAttributes(); }; findEl.oninput=paintChoices; } /* V48.1 Property actions: separate overview from user handover requests. */ function mqV48PropertyHome(){ state.screen='propertyHome';heroTitle.textContent='مدیریت اموال و داراییها';heroDesc.textContent='نمای کلی داراییها و اقدامات تحویل'; backButton.style.display='inline-block';buildBreadcrumb(['مدیریت تجهیزات','مدیریت اموال و داراییها']);mqTreeActivate('property'); var choices=[['assets','نمای کلی داراییها','لیست، وضعیت و فیلتر ویژگیهای داراییها','files'],['handover','اقدامات تحویل','درخواستهای تحویل و تحول مرتبط با حساب من','chart']]; view.innerHTML='<section class="mm-card-home" dir="rtl"><h2>مدیریت اموال و داراییها</h2><div class="mm-category-grid">'+choices.map(function(a){return '<button type="button" class="mm-category-card" data-mq-v48-property="'+a[0]+'"><span class="mm-category-icon">'+mmCardIcon(a[3])+'</span><strong>'+a[1]+'</strong></button>';}).join('')+'</div></section>'; view.querySelectorAll('[data-mq-v48-property]').forEach(function(b){b.onclick=function(){if(b.dataset.mqV48Property==='assets'){renderAssetSections('newAsset');mqTreeActivate('propertyAssets');}else mqV48Handover();};}); mmApi('handover.mine').then(function(d){if(state.screen!=='propertyHome'||!Array.isArray(d.items))return;var btn=view.querySelector('[data-mq-v48-property="handover"]');if(btn){var count=d.items.filter(function(x){return x.isRead!==true;}).length;if(count>0){var number=document.createElement('span');number.className='mq-v50-new-badge';number.textContent=String(count);number.setAttribute('aria-label',count+' اقدام جدید');number.title=count+' اقدام جدید';btn.appendChild(number);}}}).catch(function(){}); } function mqV48Handover(){ state.screen='propertyHandover';heroTitle.textContent='مدیریت اموال و داراییها';heroDesc.textContent='اقدامات تحویل'; buildBreadcrumb(['مدیریت تجهیزات','مدیریت اموال و داراییها','اقدامات تحویل']);mqTreeActivate('propertyHandover'); view.innerHTML='<section class="mq-preview mq-handover-workspace" dir="rtl"><div class="mq-assets-head"><div></div><div class="mq-assets-actions"><button type="button" id="mqV48RequestHandover" class="mq-assets-btn primary">درخواست تحویل و تحول</button><button type="button" id="mqV48ReloadHandover" class="mq-assets-btn">بهروزرسانی</button></div></div><div class="v-stats" id="mqV48HandoverSummary"></div><div class="mm-actionbar"><input id="mqV48HandoverSearch" type="search" placeholder="جستوجو در اقدامات و اسناد"></div><div id="mqV48HandoverRows" aria-live="polite">در حال دریافت...</div></section>'; var list=[],handoverBucket='new',fetchToken=0; function isNew(r){return r.isRead!==true;} function docsHtml(r){ var docs=Array.isArray(r.accountingEntries)?r.accountingEntries:[]; if(!docs.length)return ''; var items=docs.map(function(d){return '<div class="mq-handover-document"><strong>'+esc(d.title||d.key||'سند ثبتشده')+'</strong><span>'+esc(d.key||'')+(d.documentDate?' · '+esc(d.documentDate):'')+'</span><span>'+esc(d.debitAccount||'')+(d.amountRaw?' · '+esc(d.amountRaw)+' ریال':'')+'</span></div>';}).join(''); return '<details class="mq-handover-documents"><summary>'+docs.length.toLocaleString('fa-IR')+' سند ثبتشده <span aria-hidden="true">⌄</span></summary>'+items+'</details>'; } function paint(){ var input=document.getElementById('mqV48HandoverSearch'),host=document.getElementById('mqV48HandoverRows');if(!host||!input)return; var q=searchNorm(input.value||''); var match=list.filter(function(r){return (handoverBucket==='all'||isNew(r))&&searchNorm([r.key,r.summary,r.status].concat((r.accountingEntries||[]).map(function(d){return d.title||d.key||'';})).join(' ')).includes(q);}); host.innerHTML=match.length?'<div class="mq-handover-table-wrap">'+mmTable(['کلید','عنوان و اسناد ثبتشده','وضعیت','اقدام'],match.map(function(r){return [esc(r.key),'<div class="mq-handover-request-title">'+esc(r.summary||'—')+'</div>'+docsHtml(r),esc(r.status||'—'),'<div class="mq-handover-row-actions"><button class="mq-assets-btn" type="button" data-mq-v48-handover="'+esc(r.key)+'">مشاهده و اقدام</button>'+(r.isRead===true?'<span class="mq-handover-read-ok">✓ خواندهشده</span>':'<button class="mq-assets-btn mq-mark-read" type="button" data-mq-handover-read="'+esc(r.key)+'">✓ علامتگذاری بهعنوان خواندهشده</button>')+'</div>'];}))+'</div>':'<div class="mq-v48-empty">'+(handoverBucket==='new'?'اقدام جدیدی برای شما وجود ندارد. برای دیدن موارد قبلی «تمام اقدامات» را انتخاب کنید.':'موردی مطابق جستوجوی شما پیدا نشد.')+'</div>'; host.querySelectorAll('[data-mq-v48-handover]').forEach(function(b){b.onclick=function(){mmIssueDetail(b.dataset.mqV48Handover).then(mmOpenIssueModal).catch(function(e){alert(vError(e));});};}); host.querySelectorAll('[data-mq-handover-read]').forEach(function(b){b.onclick=function(){ var key=b.getAttribute('data-mq-handover-read');b.disabled=true;b.textContent='در حال ثبت...'; mmWrite('handover.markRead',{key:key}).then(function(d){ if(!d||d.ok!==true)throw Error((d&&d.message)||'ثبت وضعیت خواندهشده تأیید نشد.'); var row=list.find(function(x){return x.key===key;});if(row){row.isRead=true;row.isNew=false;} paintCards();paint(); }).catch(function(e){b.disabled=false;b.textContent='✓ علامتگذاری بهعنوان خواندهشده';alert('تغییر وضعیت خواندهشدن انجام نشد: '+vError(e));}); };}); } function paintCards(){ var summary=document.getElementById('mqV48HandoverSummary');if(!summary)return; var count=list.filter(isNew).length; summary.innerHTML='<button type="button" class="mm-kpi-card" data-handover-filter="all" aria-pressed="false"><span class="mq-handover-icon" aria-hidden="true">▦</span><strong>'+list.length.toLocaleString('fa-IR')+'</strong><span class="mq-handover-label">تمام اقدامات</span></button><button type="button" class="mm-kpi-card" data-handover-filter="new" aria-pressed="false"><span class="mq-handover-icon" aria-hidden="true">⚒</span><strong>'+count.toLocaleString('fa-IR')+'</strong><span class="mq-handover-label">اقدامات جدید</span></button>'; summary.querySelectorAll('[data-handover-filter]').forEach(function(btn){btn.classList.toggle('active',btn.dataset.handoverFilter===handoverBucket);btn.setAttribute('aria-pressed',String(btn.dataset.handoverFilter===handoverBucket));btn.onclick=function(){handoverBucket=btn.dataset.handoverFilter;paintCards();paint();};}); } function load(){ var token=++fetchToken,host=document.getElementById('mqV48HandoverRows');if(host)host.textContent='در حال دریافت درخواستهای من...'; mmApi('handover.mine').then(function(d){if(token!==fetchToken||state.screen!=='propertyHandover')return;if(!d||!Array.isArray(d.items))throw Error('خروجی handover.mine شامل items نیست.');list=d.items.filter(function(r){return r&&/^MED-\d+$/.test(r.key||'');});paintCards();paint();}).catch(function(err){if(token===fetchToken&&host&&host.isConnected)host.innerHTML='<div class="mq-v48-warning">'+esc(vError(err))+'</div>';}); } document.getElementById('mqV48RequestHandover').onclick=function(){renderAssetSections('newAsset');vProcess();}; document.getElementById('mqV48ReloadHandover').onclick=load; document.getElementById('mqV48HandoverSearch').oninput=paint; load(); } function renderAssetSections(mode){ var previousFilter=$id('vInlineFilters');if(previousFilter)previousFilter.remove(); state.screen=mode;state.selectedAssetSection='purchased';heroTitle.textContent='مدیریت اموال و داراییها';heroDesc.textContent='ثبت، ویرایش و پیگیری گردش داراییها';backButton.style.display='inline-block'; buildBreadcrumb(['مدیریت تجهیزات','مدیریت اموال و داراییها']); view.innerHTML='<section id="vAssetDashboard" aria-label="نمای کلی وضعیت داراییها"></section><div class="mq-list-layout"><aside class="mq-list-menu"><h3>وضعیت دارایی</h3><div id="v11Summary">یک دارایی از لیست انتخاب کنید.</div></aside><div class="mq-preview"><div class="mq-preview-title">لیست داراییها</div><div class="mq-assets-head"><div class="v-search"><input id="mqAssetSearch" type="search" placeholder="جستوجو در داراییها…"><button class="mq-assets-btn" id="vFilters">فیلتر ویژگیها</button><select id="vProcessFilter" class="mq-assets-btn" aria-label="فیلتر فرایند"><option value="">همه فرایندها</option><option value="handover">تحویل و تحول کاربری</option><option value="entry">ورود دارایی به انبار</option><option value="exit">خروج دارایی از انبار</option><option value="scrap">اسقاط دارایی</option></select></div><div class="mq-assets-actions"><button class="mq-assets-btn primary" id="mqAssetsNew">ثبت دارایی جدید</button><button class="mq-assets-btn primary" id="vProcess">تحویل و تحول دارایی</button><button class="mq-assets-btn" id="mqAssetsRefresh">بهروزرسانی لیست</button></div></div><p id="vService" role="status"></p><div id="mqAssetsHost"></div></div></div>'; $id('mqAssetsNew').onclick=openWizard;$id('vProcess').onclick=vProcess;$id('vFilters').onclick=vSearch;var pf=$id('vProcessFilter');if(pf)pf.onchange=function(){ var selected=pf.value,info=$id('vService'),host=$id('mqAssetsHost'); var all=cache.equipment||[],unknown=all.filter(function(r){return !vState(r).checked;}).map(function(r){return String(r.id);}); var token=(V11.processFilterToken||0)+1;V11.processFilterToken=token; if(!selected){pf.disabled=false;if(info)info.textContent='';ASSET_PAGE.page=1;if(V11.paint)V11.paint();return;} var chunks=[];for(var i=0;i<unknown.length;i+=50)chunks.push(unknown.slice(i,i+50)); function progress(done){if(token!==V11.processFilterToken)return;if(info)info.textContent='در حال بررسی فرایندها: '+done+' از '+unknown.length+' دارایی — لطفاً تا تکمیل بررسی صبر کنید';} pf.disabled=true;pf.setAttribute('aria-busy','true'); if(host)host.innerHTML='<div class="v34-process-loading" role="status" aria-live="polite"><span class="v34-spinner" aria-hidden="true"></span><strong>در حال بررسی فرایند داراییها…</strong><small>لطفاً تا پایان بررسی صبر کنید. نتیجه پس از تکمیل نمایش داده میشود.</small></div>'; progress(0); var pointer=0,done=0,workers=[]; function worker(){if(token!==V11.processFilterToken||pointer>=chunks.length)return Promise.resolve();var ids=chunks[pointer++];return vReadStates(ids).then(function(){done+=ids.length;progress(done);return worker();});} for(var w=0;w<Math.min(3,chunks.length);w++)workers.push(worker()); Promise.all(workers).then(function(){if(token!==V11.processFilterToken||!pf.isConnected)return;if(info)info.textContent='';ASSET_PAGE.page=1;if(V11.paint)V11.paint();}).catch(function(e){if(token!==V11.processFilterToken)return;if(info)info.textContent='خطا در دریافت وضعیت فرایندها: '+vError(e);if(V11.paint)V11.paint();}).finally(function(){if(token===V11.processFilterToken){pf.disabled=false;pf.removeAttribute('aria-busy');}}); }; $id('mqAssetsRefresh').onclick=function(){V11.states={};delete cache.equipment;loadAssets('mqAssetsHost','mqAssetSearch');};loadAssets('mqAssetsHost','mqAssetSearch'); } function renderEquipment(){ state.screen='equipment';heroTitle.textContent='مدیریت تجهیزات';heroDesc.textContent='حوزهٔ موردنظر را انتخاب کنید.';backButton.style.display='none';buildBreadcrumb(['مدیریت تجهیزات']); var cards=[['مدیریت تعمیر و نگهداری',ICONS.maintenance,'maintenance'],['مدیریت تأمین و لجستیک',ICONS.supply,'logistics'],['مدیریت اموال و داراییها',ICONS.property,'property'],['مدیریت مالی و بهرهوری',ICONS.finance,'finance'],['تحلیل و آنالیز','<path d="M4 19h16M6 15V9m6 6V5m6 10v-4M5 7l6-4 7 5"/><circle cx="18" cy="8" r="2"/>','analysis']]; view.innerHTML='<div class="mq-card-grid v-five">'+cards.map(function(c){var children=(c[2]==='property'||c[2]==='logistics'||c[2]==='maintenance');return '<button class="mq-module-card'+(children?' mq-has-children':'')+'" data-vmodule="'+c[2]+'"><span class="mq-module-icon"><svg viewBox="0 0 24 24">'+c[1]+'</svg></span><span class="mq-module-name">'+c[0]+'</span>'+(children?'<span class="mq-hierarchy-arrow" aria-hidden="true">↙</span>':'')+'</button>';}).join('')+'</div>'; view.querySelectorAll('[data-vmodule]').forEach(function(b){b.onclick=function(){var k=b.dataset.vmodule;if(k==='property')mqV48PropertyHome();else if(k==='logistics')renderLogistics();else if(k==='analysis')vAnalysis();else if(k==='maintenance')renderMediqMaintenance();else mqTreeSimpleEquipmentPage(cards.find(function(c){return c[2]===k;})[0],k);};});mqTreeActivate('equipment'); } function vAnalysis(){ heroTitle.textContent='تحلیل و آنالیز';heroDesc.textContent='نمای آماری داراییهای ثبتشده';backButton.style.display='inline-block'; view.innerHTML='<div class="wz-loading">در حال دریافت آمار…</div>'; apiGet('equipment').then(function(rows){var counts={};rows.forEach(function(r){var key=statusText(attr(r,ATTR.status));counts[key]=(counts[key]||0)+1;});view.innerHTML='<div class="v-stats"><div><strong>'+rows.length+'</strong><span>کل داراییها</span></div>'+Object.keys(counts).map(function(k){return '<div><strong>'+counts[k]+'</strong><span>'+esc(k)+'</span></div>';}).join('')+'</div>';}).catch(function(e){view.textContent=vError(e);}); } function vDialog(title,body){ if(W.open || $id('mqDetail').classList.contains('open'))return false; var el=$id('vDialog');if(!el){el=document.createElement('div');el.id='vDialog';el.className='v-overlay';document.getElementById('mediq-dashboard').appendChild(el);} V11.editSession=(V11.editSession||0)+1;V11.focus=document.activeElement; el.innerHTML='<section class="v-dialog" role="dialog" aria-modal="true" aria-labelledby="vDialogTitle"><header><h3 id="vDialogTitle">'+esc(title)+'</h3><button id="vClose" aria-label="بستن">×</button></header><div class="v-dialog-body">'+body+'</div><p id="vMessage" role="status"></p></section>'; el.hidden=false;$id('vClose').onclick=vClose;el.onmousedown=function(e){if(e.target===el)vClose();};$id('vClose').focus();return true; } function vClose(){if(V11.busy)return;V11.editSession=(V11.editSession||0)+1;mqCloseDatePopover();var el=$id('vDialog');if(el)el.hidden=true;if(V11.focus&&V11.focus.isConnected)V11.focus.focus();} function vMessage(text){var el=$id('vMessage');if(el)el.textContent=publicMessage(text);} function vEdit(id){ var row=findRow('equipment',id);if(!row)return; if(!vDialog('ویرایش دارایی — '+(row.key||id),'<p>ویرایش مشخصات پایه؛ تغییر مسئول، بخش و موقعیت از تحویلوتحول انجام میشود.</p><div class="v-fields">'+[[6268,'شماره سریال'],[6269,'شماره اموال'],[6281,'علت وضعیت فعلی']].map(function(f){return '<label>'+f[1]+'<input id="vEdit'+f[0]+'" maxlength="500" value="'+esc(attr(row,f[0]))+'"></label>';}).join('')+'</div><button class="mq-assets-btn primary" id="vEditSave">ثبت اقدام</button>'))return; $id('vEditSave').onclick=function(){var vals={};[6268,6269,6281].forEach(function(k){if($id('vEdit'+k).value!==attr(row,k))vals[k]=$id('vEdit'+k).value;});if(!Object.keys(vals).length)return vMessage('تغییری وارد نشده است.');V11.busy=true;this.disabled=true;operations({action:'edit',id:id,values:vals}).then(function(){V11.busy=false;vClose();V11.states={};loadAssets('mqAssetsHost','mqAssetSearch');}).catch(function(e){vMessage(vError(e));}).finally(function(){V11.busy=false;if($id('vEditSave'))$id('vEditSave').disabled=false;});}; } function vOptions(kind){return '<option value="">انتخاب کنید</option>'+(cache[kind]||[]).map(function(r){return '<option value="'+esc(r.id)+'">'+esc(labelOf(r))+'</option>';}).join('');} (function(){var header=document.querySelector('#mediq-dashboard .mq-header-left'),hero=document.querySelector('#mediq-dashboard .mq-hero');if(header&&hero)hero.appendChild(header);})(); (function(){var logo=document.querySelector('#mediq-dashboard .mq-logo');if(logo){logo.setAttribute('role','link');logo.setAttribute('tabindex','0');logo.setAttribute('title','صفحه اصلی مدیکیو');logo.onclick=function(){renderEquipment();};logo.onkeydown=function(e){if(e.key==='Enter'||e.key===' '){e.preventDefault();renderEquipment();}};}})(); function vAccessLabel(v){var m={available:'در دسترس',damaged:'آسیب دیده',lost:'گم شده',destroyed:'از بین رفته'};return m[norm(v)]||optionCaption(v)||'—';} function vStatusMark(value){ var v=norm(value),ok=(v==='active'||v==='فعال'); var off=(v==='inactive'||v==='غیرفعال'||v==='entered-in-error'||v==='ثبت اشتباه'); return '<span class="v33-status-icon '+(ok?'is-active':off?'is-inactive':'is-unknown')+'" aria-hidden="true">'+(ok?'✓':off?'×':'•')+'</span>'; } function vRequestLink(key){ key=clean(key);if(!/^[A-Z][A-Z0-9_]*-\d+$/i.test(key))return ''; return '<button type="button" class="v33-request-link mq-assets-btn" data-mq-internal-issue="'+esc(key)+'" aria-label="مشاهده درخواست '+esc(key)+' در مدیکیو">مشاهده درخواست</button>'; } function v33AccessOptions(meta){ var fixed=[{id:'lost',label:'گم شده'},{id:'damaged',label:'آسیب دیده'},{id:'destroyed',label:'از بین رفته'},{id:'available',label:'در دسترس'}]; var allowed=String(meta&&meta.options||'').split(/[,;\r\n]+/).map(function(x){return norm(x);}).filter(Boolean); return fixed.map(function(item){ var aliases={lost:['lost','گم شده','مفقود'],damaged:['damaged','آسیب دیده','آسیبدیده'],destroyed:['destroyed','از بین رفته','از رده خارج'],available:['available','در دسترس','موجود']}; var match=allowed.find(function(opt){return aliases[item.id].indexOf(opt)>=0;}); return {id:match||item.id,label:item.label}; }); } function vProcess(){ if(!vDialog('مدیریت گردش دارایی','<div class="v-operation-choices">'+Object.keys(OP_NAMES).map(function(k){return '<button class="mq-assets-btn" data-vop="'+k+'">'+OP_NAMES[k]+'</button>';}).join('')+'</div><div id="vProcessContent">نوع عملیات را انتخاب کنید.</div>'))return; var selected=Object.assign({},V11.selected),op='',page=1,token=window.crypto&&crypto.randomUUID?crypto.randomUUID():String(Date.now())+'-'+Math.random().toString(36).slice(2),committed=false; function fieldSelect(id,label,kind){return '<label>'+label+'<select id="'+id+'">'+vOptions(kind)+'</select></label>';} function form(){ var labels=''; if(op==='entry')labels=fieldSelect('vTargetLocation','انبار مقصد','location'); else if(op==='exit')labels=fieldSelect('vSourceLocation','انبار مبدأ','location')+fieldSelect('vTargetDepartment','بخش مقصد','department')+fieldSelect('vTargetResponsible','مسئول مقصد','responsible'); else if(op==='scrap')labels=fieldSelect('vSourceLocation','انبار','location'); else labels=fieldSelect('vSourceDepartment','بخش بهرهبردار فعلی','department')+fieldSelect('vSourceResponsible','مسئول فعلی','responsible')+fieldSelect('vTargetDepartment','بخش مقصد','department')+fieldSelect('vTargetResponsible','مسئول مقصد','responsible'); $id('vProcessContent').innerHTML='<h4>'+OP_NAMES[op]+'</h4><div class="v-fields">'+labels+'<label>علت / توضیحات<textarea id="vReason" maxlength="2000"></textarea></label></div>'+(op==='entry'?'<div class="v-process-controls">'+fieldSelect('vFilterDept','فیلتر بخش فعلی','department')+fieldSelect('vFilterUser','فیلتر مسئول فعلی','responsible')+'</div>':'')+'<div class="v-process-searchline"><input type="search" id="vProcessSearch" placeholder="جستوجو در داراییها"></div><div id="vProcessList"></div><div class="mq-list-controls"><button class="mq-assets-btn" id="vProcessPrev">قبلی</button><span id="vProcessCount"></span><button class="mq-assets-btn" id="vProcessNext">بعدی</button></div><p id="vConfigNotice"></p><button class="mq-assets-btn primary" id="vReview">بازبینی و ثبت</button><div id="vReviewBox"></div>'; /* V36: the primary current-section, current-owner and warehouse controls filter the list. */ if(op==='handover'||op==='exit'||op==='scrap'){ $id('vProcessContent').querySelectorAll('.v-process-controls').forEach(function(node){node.remove();}); } var reviewButton=$id('vReview'),filterBar=$id('vProcessList'); if(reviewButton&&filterBar){reviewButton.classList.add('v32-review-top');filterBar.parentNode.insertBefore(reviewButton,filterBar);var reviewBox=$id('vReviewBox');if(reviewBox)reviewButton.insertAdjacentElement('afterend',reviewBox);} ['vProcessSearch','vFilterDept','vFilterUser','vFilterLocation','vSourceDepartment','vSourceResponsible','vSourceLocation'].forEach(function(id){var el=$id(id);if(el){el.addEventListener(id==='vProcessSearch'?'input':'change',function(){page=1;selected={};paint();});}}); $id('vProcessPrev').onclick=function(){page--;paint();};$id('vProcessNext').onclick=function(){page++;paint();};$id('vReview').onclick=review;paint(); } function matches(row){ var dept=$id('vFilterDept'),user=$id('vFilterUser'),loc=$id('vFilterLocation'),sd=$id('vSourceDepartment'),su=$id('vSourceResponsible'),sl=$id('vSourceLocation'); if(dept&&dept.value&&attrList(row,V11.attrs.department||ATTR.department).indexOf(dept.value)<0)return false; if(user&&user.value&&attrList(row,V11.attrs.responsible||6282).indexOf(user.value)<0)return false; if(sd&&sd.value&&attrList(row,V11.attrs.department||ATTR.department).indexOf(sd.value)<0)return false; if(su&&su.value&&attrList(row,V11.attrs.responsible||6282).indexOf(su.value)<0)return false; var locId=V11.attrs.location;if((loc&&loc.value)||(sl&&sl.value)){if(!locId)return false;var vals=attrList(row,locId);if(loc&&loc.value&&vals.indexOf(loc.value)<0)return false;if(sl&&sl.value&&vals.indexOf(sl.value)<0)return false;} if(op==='exit' || op==='scrap'){ var meta=equipmentMetadata||{};var inStoreAttr=Object.keys(meta).find(function(k){return /^(instore|in store|در انبار)$/i.test(String(meta[k].name||meta[k].label||'').trim());}); if(!inStoreAttr)return false; if(!attrList(row,inStoreAttr).some(function(x){return /^(true|yes|1)$/i.test(x);}))return false; } return true; } function paint(){ if(!$id('vProcessList'))return; var rows=vFilter(cache.equipment||[],$id('vProcessSearch').value).filter(matches),part=assetPageSlice(rows,page,'20');page=part.page; $id('vProcessList').innerHTML='<div class="mq-tbl-wrap"><table class="v-process-table"><thead><tr><th>انتخاب</th><th>دارایی / عنوان</th><th>بخش فعلی</th><th>مسئول فعلی</th><th>وضعیت دسترسی</th></tr></thead><tbody>'+part.items.map(function(r){var st=vState(r);return '<tr><td><input type="checkbox" data-vpselect="'+esc(r.id)+'" '+(selected[r.id]?'checked ':'')+(st.active||!st.checked?'disabled ':'')+'></td><td>'+esc((attr(r,ATTR.devName)||r.label||r.key))+'</td><td>'+esc(vRef('department',r,V11.attrs.department||6277))+'</td><td>'+esc(vRef('responsible',r,V11.attrs.responsible||6282))+'</td><td>'+esc(vAccessLabel(attr(r,V11.attrs.availability||6280)))+'</td></tr>';}).join('')+(rows.length?'':'<tr><td colspan="5">دارایی مطابق فیلتر پیدا نشد.</td></tr>')+'</tbody></table></div>'; $id('vProcessCount').textContent='صفحه '+part.page+' از '+part.pages+' — '+Object.keys(selected).length+' انتخاب';$id('vProcessPrev').disabled=page===1;$id('vProcessNext').disabled=page===part.pages; $id('vConfigNotice').textContent=V11.ready?'':'ثبت فرایند پس از تکمیل تنظیمات سرویس فعال میشود.'; $id('vProcessList').querySelectorAll('[data-vpselect]').forEach(function(b){b.onchange=function(){if(b.checked)selected[b.dataset.vpselect]=true;else delete selected[b.dataset.vpselect];paint();};}); var ids=part.items.filter(function(r){return !vState(r).checked;}).map(function(r){return String(r.id);}); if(ids.length)vReadStates(ids).then(function(r){ids.forEach(function(id){if(V11.states[id]&&V11.states[id].active)delete selected[id];});if($id('vProcessList')&&!$id('vDialog').hidden)paint();}).catch(function(e){vMessage(vError(e));}); if((op==='exit'||op==='scrap')&&!Object.keys(equipmentMetadata||{}).some(function(k){return /^(instore|in store|در انبار)$/i.test(String(equipmentMetadata[k].name||equipmentMetadata[k].label||'').trim());}))$id('vConfigNotice').textContent='شناسه فیلد InStore در متادیتا مشخص نیست؛ برای جلوگیری از خروج اشتباه، انتخاب دارایی تا تنظیم فیلد غیرفعال است.'; } function review(){ var ids=Object.keys(selected),responsible=$id('vTargetResponsible'),department=$id('vTargetDepartment'),location=$id('vTargetLocation'),source=$id('vSourceLocation'); if(!ids.length)return vMessage('حداقل یک دارایی انتخاب کنید.');if(ids.length>50)return vMessage('حداکثر ۵۰ دارایی انتخاب کنید.'); var target={responsible:responsible?responsible.value:'',department:department?department.value:'',location:location?location.value:(source?source.value:'')}; if((op==='handover'||op==='exit')&&(!target.responsible||!target.department))return vMessage('مسئول و بخش مقصد الزامی است.'); if((op==='entry'||op==='exit'||op==='scrap')&&!target.location)return vMessage('انتخاب انبار الزامی است.'); if(op==='scrap'&&!$id('vReason').value.trim())return vMessage('علت اسقاط را بنویسید.'); var reason=$id('vReason').value; $id('vReviewBox').innerHTML='<h4>بازبینی درخواست</h4><p>'+esc(OP_NAMES[op])+' — '+ids.length+' دارایی</p><ul>'+ids.map(function(id){return '<li>'+esc(labelOf(findRow('equipment',id)))+'</li>';}).join('')+'</ul><button class="mq-assets-btn primary" id="vCommit" '+(!V11.ready||committed?'disabled':'')+'>ثبت نهایی درخواست</button>'; $id('vCommit').onclick=function(){if(committed||V11.busy)return;V11.busy=true;this.disabled=true; operations({action:'start',operation:op,ids:ids,target:target,reason:reason,dateLabel:new Intl.DateTimeFormat('fa-IR',{year:'numeric',month:'2-digit',day:'2-digit'}).format(new Date()),token:token}).then(function(r){committed=true;V11.selected={};V11.states={};$id('vProcessContent').innerHTML='<h3>درخواست '+esc(r.parentKey)+' ثبت شد</h3><p>'+esc(r.message)+'</p>'+vRequestLink(r.parentKey);loadAssets('mqAssetsHost','mqAssetSearch');}).catch(function(e){vMessage(vError(e));if($id('vCommit'))$id('vCommit').disabled=false;}).finally(function(){V11.busy=false;}); }; } $id('vDialog').querySelectorAll('[data-vop]').forEach(function(b){b.onclick=function(){if(V11.busy||committed)return;op=b.dataset.vop;$id('vDialog').querySelectorAll('[data-vop]').forEach(function(x){x.classList.toggle('primary',x===b);});Promise.all([apiGet('location').catch(function(){return [];}),apiGet('department'),apiGet('responsible'),loadExtraEquipment().catch(function(){return [];})]).then(function(){if(op)form();}).catch(function(e){vMessage(vError(e));});};}); vReadStates([]).catch(function(e){vMessage(vError(e));}); } document.addEventListener('keydown',function(e){var el=$id('vDialog');if(!el||el.hidden)return;if(e.key==='Escape')vClose();if(e.key==='Tab'){var list=Array.from(el.querySelectorAll('button:not([disabled]),input:not([disabled]),select,textarea')).filter(function(x){return x.offsetParent!==null;});if(!list.length)return;var first=list[0],last=list[list.length-1];if(e.shiftKey&&document.activeElement===first){e.preventDefault();last.focus();}else if(!e.shiftKey&&document.activeElement===last){e.preventDefault();first.focus();}}}); /* Full metadata-driven equipment editor, V12. */ function vEditDefinitions(){ var excluded=[6265,6270,6366,6401]; var captions={6261:'کد دارایی',6263:'تاریخ ایجاد',6264:'آخرین تغییر',6267:'شناسه دستگاه',6269:'شماره اموال',6271:'تاریخ خرید',6272:'فروشنده',6277:'بخش بهرهبردار / موقعیت مکانی فعلی',6279:'وضعیت',6644:'مدل دستگاه',6698:'آزمایشی'}; var segments=[['مشخصات پایه',[6261,6263,6264,6644,6267,6268,6269]],['فنی و اجزا',[6284,6285,6286,6400,6290,6402,6291]],['مالی و خرید',[6271,6272,6273,6274,6287,6671]],['موقعیت و مسئولان',[6277,6392,6282,6283,6396]],['وضعیت و تاریخها',[6279,6280,6281,6288,6289,6275,6276,6365,6390,6649,6672]]]; var fields=Object.keys(equipmentMetadata).map(function(key){var m=equipmentMetadata[key],id=Number(key),known=EQUIPMENT_FIELDS.find(function(f){return f[0]===id;}); var kind=m.objectReference||String(m.type)==='REFERENCED_OBJECT'?'ref':m.dateTimeType?'datetime-local':m.dateType?'date':m.booleanType?'boolean':m.numericType?'number':String(m.options||'').trim()||id===6279?'select':'text'; var bucket=segments.findIndex(function(s){return s[1].indexOf(id)>=0;}); return {id:id,meta:m,label:captions[id]||(known?known[2]:publicMessage(m.name)),kind:kind,segment:bucket<0?5:bucket,multi:Number(m.maximumCardinality)>1||Number(m.maximumCardinality)===-1,required:Number(m.minimumCardinality)>0,editable:[6261,6263,6264].indexOf(id)<0&&['DEFAULT','REFERENCED_OBJECT'].indexOf(String(m.type))>=0}; }).filter(function(f){return excluded.indexOf(f.id)<0;}).sort(function(a,b){return a.segment-b.segment||a.id-b.id;}); return {fields:fields,segments:segments.map(function(x){return x[0];}).concat(['سایر اطلاعات'])}; } function vEdit(id){ var row=findRow('equipment',id);if(!row)return; if(!vDialog('ویرایش دارایی — '+(row.key||id),'<div class="wz-loading">در حال دریافت تمام فیلدهای دارایی…</div>'))return; var session=++V11.editSession||1;V11.editSession=session; var dialog=$id('vDialog'); jfetch(API.read+'?kind=metadata').then(function(r){ if(dialog.hidden||session!==V11.editSession)return null; equipmentMetadata={};((r.metadata.equipment||{}).attributes||[]).forEach(function(a){equipmentMetadata[String(a.id)]=a;}); var def=vEditDefinitions(); return Promise.all(def.fields.filter(function(f){return f.kind==='ref';}).map(function(f){return apiGet('equipmentRef_'+f.id).then(function(rows){f.rows=rows;});})).then(function(){return def;}); }).then(function(def){ if(!def||dialog.hidden||session!==V11.editSession)return; var fields=def.fields,initial={},editing=true; function options(f){ var rows=f.kind==='ref'?(f.rows||[]):f.kind==='boolean'?[{id:'true',label:'بله'},{id:'false',label:'خیر'}]:String(f.meta.options||'').split(/[,;\r\n]+/).map(function(s){return s.trim();}).filter(Boolean).map(function(v){return {id:v,label:optionCaption(v)};}); if(f.id===6279&&!rows.length)rows=Object.keys(STATUS_FA).map(function(k){return {id:k,label:STATUS_FA[k]};}); if(f.id===6280)rows=v33AccessOptions(f.meta); rows=rows.slice();attrList(row,f.id).forEach(function(v){if(!rows.some(function(r){return String(r.id)===String(v);}))rows.push({id:v,label:f.kind==='ref'?'مقدار ثبتشده: '+v:optionCaption(v)});}); return rows; } function render(f){ var cid='vAll'+f.id,values=attrList(row,f.id),value=values[0]||'',body=''; if(f.id===6261)value=row.key||value; if(!f.editable)return '<div class="wz-field"><label>'+esc(f.label)+'</label><input readonly value="'+esc(f.kind==='date'||f.kind==='datetime-local'?displayJalali(value,f.kind==='datetime-local'):f.id===6261?value:values.join('، '))+'"></div>'; if(['ref','select','boolean'].indexOf(f.kind)>=0){ body='<select id="'+cid+'" '+(f.multi?'multiple size="5"':'')+' '+(f.required?'required':'')+'>'+(!f.multi?'<option value="">انتخاب کنید</option>':'')+options(f).map(function(r){return '<option value="'+esc(r.id)+'" '+(values.indexOf(String(r.id))>=0?'selected':'')+'>'+esc(labelOf(r))+'</option>';}).join('')+'</select>'; }else if(f.kind==='date'||f.kind==='datetime-local')return jalaliField(cid,f.label,value,f.kind==='datetime-local',f.required); else if(f.multi)body='<textarea id="'+cid+'" rows="4" '+(f.required?'required':'')+'>'+esc(values.join('\n'))+'</textarea><small>هر مقدار در یک خط</small>'; else body='<input id="'+cid+'" type="'+(f.kind==='number'?'number':'text')+'" '+(f.kind==='number'?'step="any"':'')+' '+(f.required?'required':'')+' value="'+esc(value)+'">'; return '<div class="wz-field"><label for="'+cid+'">'+esc(f.label)+(f.required?' *':'')+'</label>'+body+'</div>'; } dialog.querySelector('.v-dialog-body').id='vEditBody'; var groups=def.segments.map(function(label,i){return {index:i,label:label,fields:fields.filter(function(f){return f.segment===i;})};}).filter(function(g){return g.fields.length;}); $id('vEditBody').innerHTML='<div class="v-editor-tabs" role="tablist">'+groups.map(function(g,j){return '<button type="button" role="tab" id="vEditTab'+g.index+'" data-edit-tab="'+g.index+'" aria-controls="vEditPanel'+g.index+'" aria-selected="'+(j===0)+'">'+g.label+'</button>';}).join('')+'</div><div class="v-editor-sections">'+groups.map(function(g,j){return '<section role="tabpanel" id="vEditPanel'+g.index+'" aria-labelledby="vEditTab'+g.index+'" data-edit-panel="'+g.index+'" '+(j?'hidden':'')+'><h4>'+g.label+'</h4><div class="v-fields">'+g.fields.map(render).join('')+'</div></section>';}).join('')+'</div><div class="v-editor-footer"><span>فقط فیلدهای تغییرکرده ذخیره میشوند.</span><button type="button" class="mq-assets-btn primary" id="vEditSave">ثبت اقدام</button></div>'; function tab(index){mqCloseDatePopover();dialog.querySelectorAll('[data-edit-panel]').forEach(function(p){p.hidden=p.dataset.editPanel!==String(index);});dialog.querySelectorAll('[data-edit-tab]').forEach(function(b){var active=b.dataset.editTab===String(index);b.classList.toggle('active',active);b.setAttribute('aria-selected',String(active));b.tabIndex=active?0:-1;});} dialog.querySelectorAll('[data-edit-tab]').forEach(function(b){b.onclick=function(){tab(b.dataset.editTab);};b.onkeydown=function(e){if(['ArrowLeft','ArrowRight','Home','End'].indexOf(e.key)<0)return;e.preventDefault();var buttons=Array.from(dialog.querySelectorAll('[data-edit-tab]')),i=buttons.indexOf(b);i=e.key==='Home'?0:e.key==='End'?buttons.length-1:(i+(e.key==='ArrowLeft'?1:-1)+buttons.length)%buttons.length;tab(buttons[i].dataset.editTab);buttons[i].focus();};});tab(groups[0].index); function raw(f){var el=$id('vAll'+f.id);return el.multiple?Array.from(el.selectedOptions).map(function(o){return o.value;}):el.value;} fields.filter(function(f){return f.editable;}).forEach(function(f){initial[f.id]=JSON.stringify(raw(f));}); bindJalaliInputs(); $id('vEditSave').onclick=function(){ if(V11.busy||!editing)return; var values={},expected={}; try{fields.filter(function(f){return f.editable;}).forEach(function(f){var el=$id('vAll'+f.id),value=raw(f);if(JSON.stringify(value)===initial[f.id])return; if(!el.checkValidity()){tab(f.segment);el.focus();el.reportValidity();throw new Error('مقدار «'+f.label+'» معتبر نیست.');} if(f.kind==='date'||f.kind==='datetime-local'){try{value=parseJalali(value,f.kind==='datetime-local');}catch(e){tab(f.segment);el.focus();throw e;}} else if(f.multi&&!el.multiple)value=String(value).split(/\r?\n/).map(function(v){return v.trim();}).filter(Boolean); values[String(f.id)]=value;expected[String(f.id)]=attrList(row,f.id); });}catch(e){vMessage(vError(e));return;} if(!Object.keys(values).length)return vMessage('تغییری وارد نشده است.'); mqCloseDatePopover();V11.busy=true;this.disabled=true; operations({action:'edit',id:String(id),values:values,expected:expected}).then(function(){editing=false;V11.busy=false;vClose();V11.states={};loadAssets('mqAssetsHost','mqAssetSearch');}).catch(function(e){vMessage(vError(e));}).finally(function(){V11.busy=false;if($id('vEditSave'))$id('vEditSave').disabled=false;}); }; }).catch(function(e){if(!dialog.hidden&&session===V11.editSession){dialog.querySelector('.v-dialog-body').textContent='دریافت فرم ویرایش کامل نشد.';vMessage(vError(e));}}); } /* Live process progress. The only polling action is state (read-only). */ var V13_LIVE={busy:false,sequence:0,lastAsset:null,error:'',updated:0}; function vTimelineStates(s){ var path=s.stages||[],current=path.findIndex(function(step){return String(step.id)===String(s.statusId);}); return path.map(function(step,i){ var left=step.leftAt,entered=step.enteredAt,confirmed=!!(entered&&left&&left>=entered); var state=i===current?(s.active?'current':s.completed?'done':'pending'):(i<current&&confirmed?'done':'pending'); return {id:step.id,label:step.name,state:state,enteredAt:entered||'',leftAt:left||''}; }); } function vTimelineHost(){ var root=$id('v11Summary');if(!root)return null; var host=$id('vLiveTimeline');if(!host){host=document.createElement('section');host.id='vLiveTimeline';host.className='v-live-timeline';host.setAttribute('aria-label','روند فرایند دارایی');root.parentNode.appendChild(host);} return host; } function vRenderTimeline(row,s){ var host=vTimelineHost();if(!host)return; host.innerHTML='<header><strong>'+(s.active?'روند فرایند':s.hasProcess?'آخرین فرایند':'روند فرایند')+'</strong></header>'; if(!s.checked){host.innerHTML+='<p>در حال دریافت اطلاعات…</p>';return;} if(!s.hasProcess&&!s.issueKey){host.innerHTML+='<p>فرایند ثبتشدهای برای این دارایی یافت نشد.</p>';return;} var steps=vTimelineStates(s); host.innerHTML+='<ol class="v-circle-track" aria-label="مراحل فرایند">'+steps.map(function(step,i){return '<li class="v-circle-step '+step.state+'" '+(step.state==='current'?'aria-current="step"':'')+'><div class="v-circle-rail"><span class="v-circle-node" aria-hidden="true">'+(step.state==='done'?'✓':step.state==='current'?'<i></i>':'')+'</span><span class="v-circle-line '+(steps[i+1]&&step.state==='done'&&(steps[i+1].state==='done'||steps[i+1].state==='current')?'done':'')+'"></span></div><strong>'+esc(step.label)+'</strong><small>'+esc(step.state==='current'?'مرحلهٔ جاری':step.state==='done'?'انجامشده':step.enteredAt?'قبلاً طی شده':'در انتظار')+'</small></li>';}).join('')+'</ol>'+vRequestLink(s.issueKey); if(s.historyWarning)host.innerHTML+='<p class="v-timeline-warning">اطلاعات سابقهٔ مراحل کامل نیست.</p>'; if(steps.length&&!steps.some(function(x){return String(x.id)===String(s.statusId);}))host.innerHTML+='<p class="v-timeline-warning">وضعیت جاری در مسیر نمایش تنظیمشده نیست.</p>'; } function vPanel(id){ var row=findRow('equipment',id),box=$id('v11Summary');if(!row||!box)return; if(V13_LIVE.lastAsset!==String(id)){V13_LIVE.sequence++;V13_LIVE.lastAsset=String(id);V13_LIVE.error='';V13_LIVE.updated=0;} V11.row=String(id);var s=vState(row),a=V11.attrs; var labels={handover:'در حال تحویل کاربری',entry:'در حال ورود به انبار',exit:'در حال خروج از انبار',scrap:'در حال اسقاط'}; var data=[['مسئول بهرهبردار',vRef('responsible',row,a.responsible)],['بخش بهرهبردار',vRef('department',row,a.department)],['موقعیت فعلی',vRef('location',row,a.location||6277)],['وضعیت',statusText(attr(row,a.status))],['وضعیت دسترسی',vAccessLabel(attr(row,a.availability))],['وضعیت اموالداری',s.active?(s.conflict?'چند فرایند فعال؛ نیازمند بررسی':labels[s.operation]||'در حال پردازش'):s.checked?'پایدار':'در حال بررسی']]; box.innerHTML='<strong>'+esc(attr(row,ATTR.devName)||row.label)+'</strong>'+data.map(function(d){return '<div class="v-summary-row"><span>'+esc(d[0])+'</span><b>'+(d[0]==='وضعیت'?vStatusMark(attr(row,a.status)):'')+esc(d[1])+'</b></div>';}).join(''); vRenderTimeline(row,s); } function vLiveRefresh(){ if(V13_LIVE.busy||V11.busy||document.hidden||!$id('v11Summary')||!V11.row)return; var id=String(V11.row),seq=V13_LIVE.sequence;V13_LIVE.busy=true; operations({action:'state',ids:[id]}).then(function(r){ if(seq!==V13_LIVE.sequence||String(V11.row)!==id||!$id('v11Summary'))return; if(!r.states||!r.states[id])throw new Error('پاسخ بررسی وضعیت کامل نیست.'); V11.states[id]=Object.assign({checked:true},r.states[id]);V13_LIVE.error='';V13_LIVE.updated=Date.now(); V11.ready=r.ready;V11.missing=r.missing||[];Object.assign(V11.attrs,r.attributes||{}); vPanel(id); document.querySelectorAll('[data-vselect="'+id+'"],[data-vedit="'+id+'"]').forEach(function(b){b.disabled=!!r.states[id].active;if(r.states[id].active&&b.type==='checkbox'){b.checked=false;delete V11.selected[id];}}); }).catch(function(e){if(seq===V13_LIVE.sequence){V13_LIVE.error=vError(e);var row=findRow('equipment',id);if(row)vRenderTimeline(row,vState(row));}}).finally(function(){V13_LIVE.busy=false;}); } setInterval(vLiveRefresh,5000); document.addEventListener('visibilitychange',function(){if(!document.hidden)vLiveRefresh();}); window.addEventListener('focus',vLiveRefresh); /* Equipment status summary is calculated over the complete equipment list. */ var V14_STATUS={filter:'all'}; function vAssetStatusGroup(row){ var raw=searchNorm(attr(row,ATTR.status)).replace(/\s+/g,''); if(raw==='active'||raw==='فعال')return 'active'; if(raw==='inactive'||raw==='غیرفعال'||raw==='غيرفعال')return 'inactive'; return 'other'; } function vAssetStatusCounts(rows){ var counts={all:rows.length,active:0,inactive:0,other:0}; rows.forEach(function(row){counts[vAssetStatusGroup(row)]++;});return counts; } function vRenderStatusDashboard(rows){ var host=$id('vAssetDashboard');if(!host)return; var counts=vAssetStatusCounts(rows),fa=new Intl.NumberFormat('fa-IR'); var icons={all:'<rect x="3" y="3" width="7" height="7" rx="2"/><rect x="14" y="3" width="7" height="7" rx="2"/><rect x="3" y="14" width="7" height="7" rx="2"/><rect x="14" y="14" width="7" height="7" rx="2"/>',active:'<circle cx="12" cy="12" r="9"/><path d="m8 12 3 3 5-6"/>',inactive:'<circle cx="12" cy="12" r="9"/><path d="M9 8v8m6-8v8"/>',other:'<path d="m12 3 10 17H2Z"/><path d="M12 9v4m0 3v1"/>'}; var names={all:'کل داراییها',active:'داراییهای فعال',inactive:'داراییهای غیرفعال',other:'سایر وضعیتها'}; host.innerHTML='<div class="v-dashboard-heading"><div><strong>نمای کلی داراییها</strong><span>آمار کل داراییها؛ مستقل از جستوجو و صفحهبندی</span></div><small>برای فیلتر لیست، یک کارت را انتخاب کنید.</small></div><div class="v-status-cards">'+['all','active','inactive','other'].map(function(key){var value=counts[key],percent=counts.all?Math.round(value/counts.all*100):0;return '<button type="button" class="v-stat-card '+key+(V14_STATUS.filter===key?' selected':'')+'" data-status-card="'+key+'" aria-pressed="'+(V14_STATUS.filter===key)+'"><span class="v-stat-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">'+icons[key]+'</svg></span><span class="v-stat-label">'+names[key]+'</span><strong>'+fa.format(value)+'</strong><span class="v-stat-bottom">'+(key==='all'?'نمایش همهٔ وضعیتها':fa.format(percent)+'٪ از کل داراییها')+'</span><span class="v-stat-meter" aria-hidden="true"><i style="width:'+percent+'%"></i></span></button>';}).join('')+'</div>'; host.querySelectorAll('[data-status-card]').forEach(function(b){b.onclick=function(){V14_STATUS.filter=b.dataset.statusCard;ASSET_PAGE.page=1;vRenderStatusDashboard(rows);if(V11.paint)V11.paint();};}); } /* V30 logistics navigation override: preserve existing backend routes. */ function renderLogistics(){ state.screen='logistics';heroTitle.textContent='مدیریت تأمین و لجستیک';heroDesc.textContent='دسته موردنظر را انتخاب کنید.';backButton.style.display='inline-block';buildBreadcrumb(['مدیریت تجهیزات','مدیریت تأمین و لجستیک']); var options=[['کالاهای مصرفی','consumable',ICONS.consumable],['داراییهای ثابت','fixed',ICONS.property],['تأمینکنندهها','suppliers',ICONS.supply]]; view.innerHTML='<div class="mq-card-grid">'+options.map(function(o){return '<button type="button" class="mq-module-card mq-has-children" data-logistic="'+o[1]+'"><span class="mq-module-icon"><svg viewBox="0 0 24 24">'+o[2]+'</svg></span><span class="mq-module-name">'+o[0]+'</span><span class="mq-hierarchy-arrow" aria-hidden="true">↙</span></button>';}).join('')+'</div>'; view.querySelectorAll('[data-logistic]').forEach(function(btn){btn.onclick=function(){var k=btn.dataset.logistic;if(k==='suppliers')vSupplierScreen();else if(k==='fixed')renderAssetSections('newAsset');else{state.screen='consumable';renderSimplePage('کالاهای مصرفی');mqTreeActivate('consumable');}};});mqTreeActivate('logistics'); } function vSupplierScreen(){ state.screen='suppliers';heroTitle.textContent='تأمینکنندهها';heroDesc.textContent='فهرست تأمینکنندگان ثبتشده در سامانه داراییها';backButton.style.display='inline-block';buildBreadcrumb(['مدیریت تجهیزات','مدیریت تأمین و لجستیک','تأمینکنندهها']); mqTreeActivate('suppliers');view.innerHTML='<div class="mq-preview"><div class="mq-preview-title">تأمینکنندهها</div><div class="mq-assets-head"><input class="mq-edit-search" id="vSupplierSearch" placeholder="جستوجوی تأمینکننده"><button type="button" class="mq-assets-btn" id="vSupplierReload">بهروزرسانی لیست</button></div><div id="vSupplierList" class="mq-assets-host"><div class="wz-loading">در حال دریافت اطلاعات…</div></div></div>'; var rows=[];function paint(){var host=$id('vSupplierList');if(!host)return;var q=searchNorm($id('vSupplierSearch').value);var subset=rows.filter(function(r){return searchNorm([r.key,r.label,r.id].join(' ')).indexOf(q)>=0;}).slice(0,250);host.innerHTML='<div class="mq-tbl-wrap"><table class="mq-tbl"><thead><tr><th>شناسه</th><th>نام تأمینکننده</th></tr></thead><tbody>'+subset.map(function(r){return '<tr><td>'+esc(r.key||r.id)+'</td><td>'+esc(labelOf(r))+'</td></tr>';}).join('')+'</tbody></table></div><p>'+subset.length+' مورد نمایش داده شده</p>';} function load(force){apiGet('supplier',force).then(function(r){rows=r;paint();}).catch(function(e){$id('vSupplierList').textContent=vError(e);});} $id('vSupplierSearch').oninput=paint;$id('vSupplierReload').onclick=function(){load(true);};load(false); } /* MEDIQ MAINTENANCE V1 - dashboard embedded module */ var MM={tab:'overview',overview:null,plans:[],suppliers:[],equipment:[],activities:[]}; /* MediQ V37.2: maintenance requests always target Confluence root, not AJS.contextPath. */ var MM_PROXY_ROOT = window.location.protocol + '//' + window.location.host + '/rest/scriptrunner/latest/custom/'; function mmRequest(url, options) { return jfetch(url, options).catch(function(err) { var message = (err && err.message) ? err.message : String(err); var enriched = new Error(message + ' | آدرس درخواست: ' + url + ' | لطفاً نسخه صفحه و Network مرورگر را بررسی کنید.'); enriched.status = err && err.status; throw enriched; }); } function mmApi(action,values) { var q='?action='+encodeURIComponent(action); if(values&&values.type) q+='&type='+encodeURIComponent(values.type); return mmRequest(MM_PROXY_ROOT+'mediqMaintenanceProxy'+q,{method:'GET',cache:'no-store'}); } function mmWrite(action,data) { return mmRequest(MM_PROXY_ROOT+'mediqMaintenanceProxyWrite',{ method:'POST',headers:{'Content-Type':'application/json','X-Atlassian-Token':'no-check'}, body:JSON.stringify(Object.assign({action:action},data||{})) }); } function mmBtn(text,action){return '<button type="button" class="mq-assets-btn" data-mm="'+esc(action)+'">'+esc(text)+'</button>';} function mmTable(headers,rows){return '<div class="mq-tbl-wrap"><table class="mq-tbl"><thead><tr>'+headers.map(function(h){return '<th>'+esc(h)+'</th>';}).join('')+'</tr></thead><tbody>'+(rows.length?rows.map(function(c){return '<tr>'+c.map(function(v){return '<td>'+v+'</td>';}).join('')+'</tr>';}).join(''):'<tr><td colspan="'+headers.length+'">موردی یافت نشد.</td></tr>')+'</tbody></table></div>';} function mmSelect(id,label,items,placeholder){return '<label>'+label+'<select id="'+id+'"><option value="">'+(placeholder||'انتخاب کنید')+'</option>'+items.map(function(x){return '<option value="'+esc(x.key)+'">'+esc(x.label||x.name||x.key)+'</option>';}).join('')+'</select></label>';} function mmField(id,label,type){return '<label>'+label+'<input id="'+id+'" type="'+(type||'text')+'"></label>';} function mmTxt(id,label){return '<label>'+label+'<textarea id="'+id+'" rows="3"></textarea></label>';} function mmVal(id){return clean(($id(id)||{}).value);} function mmFaDate(raw){ if(!raw)return '—';var s=String(raw).trim();var d=null; var iso=s.match(/^(\d{4})-(\d{2})-(\d{2})/); if(iso)d=new Date(Date.UTC(+iso[1],+iso[2]-1,+iso[3],12)); else {var y=s.match(/(20\d{2})/), months={Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,Oct:9,Nov:10,Dec:11};var en=s.match(/\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d{1,2})\b/);if(en&&y)d=new Date(Date.UTC(+y[1],months[en[1]],+en[2],12));else {var ts=Date.parse(s);if(!isNaN(ts))d=new Date(ts);}} if(!d||isNaN(d.getTime()))return 'تاریخ نامشخص';return new Intl.DateTimeFormat('fa-IR-u-ca-persian',{year:'numeric',month:'2-digit',day:'2-digit',timeZone:'UTC'}).format(d); } function mmIsoDate(v){var value=String(v||'').replace(/[۰-۹]/g,function(c){return String('۰۱۲۳۴۵۶۷۸۹'.indexOf(c));}).replace(/[٠-٩]/g,function(c){return String('٠١٢٣٤٥٦٧٨٩'.indexOf(c));});if(/^\d{4}-\d{2}-\d{2}$/.test(value))return value;var m=value.match(/^(\d{4})\/(\d{1,2})\/(\d{1,2})$/);if(!m)throw new Error('تاریخ شمسی را به صورت ۱۴۰۵/۰۸/۰۹ وارد کنید.');var y=+m[1],mo=+m[2],day=+m[3];if(y<1300||y>1600||mo<1||mo>12||day<1||day>31)throw new Error('تاریخ شمسی معتبر نیست.');var fmt=new Intl.DateTimeFormat('en-US-u-ca-persian',{year:'numeric',month:'numeric',day:'numeric',timeZone:'UTC'});var target=y*10000+mo*100+day;var low=Date.UTC(y+620,0,1),high=Date.UTC(y+623,11,31),guess=null;while(low<=high){var mid=Math.floor((low+high)/2/86400000)*86400000;var parts=fmt.formatToParts(new Date(mid));var d={};parts.forEach(function(p){if(p.type==='year'||p.type==='month'||p.type==='day')d[p.type]=+p.value;});var n=d.year*10000+d.month*100+d.day;if(n===target){guess=new Date(mid).toISOString().slice(0,10);break;}if(n<target)low=mid+86400000;else high=mid-86400000;}if(!guess)throw new Error('تاریخ شمسی وارد شده معتبر نیست.');return guess;} function mmPlanState(p){var end=p.end||p.endDate||p.expiryDate;if(end){/* expiration is enforced in Jira Assets by scheduled job, never a display-only status */}var x=String(p.stateName||p.state||'').trim().toUpperCase();if(x==='1'||x==='ACTIVE'||x==='فعال')return 'فعال';if(x==='6'||x==='2'||x==='INACTIVE'||x==='STOPPED'||x==='غیرفعال'||x==='غیرفعال شده')return 'غیرفعال';return x?('وضعیت تعریفنشده ('+x+')'):'نامشخص';} function mmKind(k){return String(k||'').toUpperCase()==='INSPECTION'?'بازرسی':'نگهداری پیشگیرانه';} function mmPlanToggleBtn(p){var active=mmPlanState(p)==='فعال';return '<button type="button" class="mq-assets-btn" data-mm-plan-toggle="'+esc(p.key)+'" data-mm-plan-state="'+(active?'inactive':'active')+'">'+(active?'غیرفعالکردن':'فعالکردن')+'</button>'; } function mmJDateField(id,label){return '<label>'+label+'<span class="mm-date-line"><input id="'+id+'" type="text" inputmode="none" placeholder="برای انتخاب تاریخ کلیک کنید" dir="ltr" autocomplete="off" readonly aria-label="انتخاب تاریخ شمسی" aria-haspopup="dialog" aria-expanded="false"></span><span id="'+id+'_cal" class="mm-cal" role="dialog" aria-label="تقویم شمسی" hidden></span></label>';} function mmCalendar(id){var input=$id(id),host=$id(id+'_cal');if(!input||!host)return;var wasOpen=!host.hidden;document.querySelectorAll('#mmContent .mm-cal').forEach(function(h){h.hidden=true;});if(wasOpen){input.setAttribute('aria-expanded','false');return;} var today=new Intl.DateTimeFormat('en-US-u-ca-persian',{year:'numeric',month:'numeric',day:'numeric',timeZone:'UTC'}).formatToParts(new Date());var p={};today.forEach(function(a){if(a.type==='year'||a.type==='month'||a.type==='day')p[a.type]=+a.value;});var match=String(input.value||'').replace(/[۰-۹]/g,function(c){return '۰۱۲۳۴۵۶۷۸۹'.indexOf(c);}).match(/^(\d{4})\/(\d{1,2})\/(\d{1,2})$/);var year=match?+match[1]:p.year,month=match?+match[2]:p.month;var months=['فروردین','اردیبهشت','خرداد','تیر','مرداد','شهریور','مهر','آبان','آذر','دی','بهمن','اسفند'];function render(){var count=month<=6?31:month<=11?30:30;try{mmIsoDate(year+'/'+month+'/30');}catch(e){if(month===12)count=29;}var html='<div class="mm-cal-head"><button type="button" data-cal-shift="-1">ماه قبل</button><strong>'+months[month-1]+' '+year.toLocaleString('fa-IR',{useGrouping:false})+'</strong><button type="button" data-cal-shift="1">ماه بعد</button></div><div class="mm-cal-days">'+['ش','ی','د','س','چ','پ','ج'].map(function(x){return '<b>'+x+'</b>';}).join('');var first=new Date(mmIsoDate(year+'/'+month+'/1')+'T12:00:00Z').getUTCDay();var offset=(first+1)%7;for(var i=0;i<offset;i++)html+='<i></i>';for(var day=1;day<=count;day++){var iso=mmIsoDate(year+'/'+month+'/'+day);var now=new Date(),todayIso=now.getFullYear()+'-'+String(now.getMonth()+1).padStart(2,'0')+'-'+String(now.getDate()).padStart(2,'0');var disabled=id==='mm_start'&&iso<todayIso;html+='<button type="button" data-cal-day="'+day+'"'+(disabled?' disabled title="تاریخ گذشته مجاز نیست"':'')+'>'+day.toLocaleString('fa-IR')+'</button>';}html+='</div>';host.innerHTML=html;host.querySelectorAll('[data-cal-shift]').forEach(function(b){b.onclick=function(){month+=Number(b.dataset.calShift);if(month<1){month=12;year--;}if(month>12){month=1;year++;}render();};});host.querySelectorAll('[data-cal-day]').forEach(function(b){b.onclick=function(){var pad=function(n){return String(n).padStart(2,'0');};input.value=(year+'/'+pad(month)+'/'+pad(+b.dataset.calDay)).replace(/\d/g,function(n){return '۰۱۲۳۴۵۶۷۸۹'[+n];});host.hidden=true;input.setAttribute('aria-expanded','false');};});}host.hidden=false;input.setAttribute('aria-expanded','true');render();requestAnimationFrame(function(){if(host.hidden||!input.isConnected)return;var r=input.getBoundingClientRect(),w=Math.min(340,window.innerWidth-20),h=Math.min(host.offsetHeight,window.innerHeight-20);var top=r.bottom+8;if(top+h>window.innerHeight-8)top=Math.max(8,r.top-h-8);var left=Math.max(8,Math.min(window.innerWidth-w-8,r.right-w));host.style.top=top+'px';host.style.left=left+'px';host.style.width=w+'px';});} function mmDonut(items,title){var sum=items.reduce(function(n,x){return n+x.n;},0);var angle=0,stops=[];items.forEach(function(x){var a=sum?x.n/sum*100:0;stops.push(x.color+' '+angle+'% '+(angle+a)+'%');angle+=a;});return '<div class="mm-chart-card"><strong>'+esc(title)+'</strong><div class="mm-donut" style="background:conic-gradient('+(stops.join(',')||'#dce9f2 0% 100%')+')"><div>'+sum.toLocaleString('fa-IR')+'<small>مجموع</small></div></div><div class="mm-chart-legend">'+items.map(function(x){return '<span><i style="background:'+x.color+'"></i>'+esc(x.label)+' <b>'+x.n.toLocaleString('fa-IR')+'</b></span>';}).join('')+'</div></div>';} function mmEvaluationDashboard(rows){var scores=[1,2,3,4,5].map(function(v){return {label:v.toLocaleString('fa-IR')+' ستاره',n:rows.filter(function(r){return +r.score===v;}).length,color:['#e66b61','#f5a35d','#e4c45d','#57a8d3','#29a38b'][v-1]};});return '<div class="mm-chart-row">'+mmDonut(scores,'توزیع امتیازهای تعمیرکاران')+'</div>';} function mmSupplyForm(){return mmForm(mmField('mm_name','نام شرکت / تعمیرکار')+mmField('mm_phone','تلفن')+mmField('mm_address','آدرس')+mmField('mm_contact','نام رابط')+mmField('mm_contactPhone','تلفن رابط')+'<label>گروه تأمینکننده<select id="mm_category"><option value="">انتخاب کنید</option><option value="(Consumables)">مصرفی</option><option value="(Capital)">سرمایهای</option><option value="(Service)">سرویس</option><option value="(Spare Parts)">قطعات</option><option value="(Indirect)">زیرساخت</option></select></label>','supplier.create',['name','phone','address','contact','contactPhone','category']);} function mmSave(action,fields){ var button=$id('mmSubmit'),notice=$id('mmNotice'),fileInput=$id('mmLocalAttachment'); if(!button||!notice)return; var payload={};fields.forEach(function(k){payload[k]=mmVal('mm_'+k);}); try{if(action==='pm.create'||action==='contract.save'){if(payload.start)payload.start=mmIsoDate(payload.start);if(payload.end)payload.end=mmIsoDate(payload.end);if(payload.end&&payload.start&&payload.end<payload.start)throw new Error('تاریخ پایان پیش از شروع است.');}} catch(e){notice.textContent=e.message;return;} button.disabled=true;notice.textContent='در حال ثبت...'; var file=fileInput&&fileInput.files&&fileInput.files[0]; var work; if(action==='contract.save')work=mmCreateContractWithPage(payload,file); else if(action==='document.save')work=mmCreateDocumentWithPage(payload,file); else if(file)work=Promise.reject(new Error('پیوست این نوع فرم هنوز به فضای ذخیره متصل نیست. اطلاعات ثبت نشد.')); else work=mmWrite(action,payload); work.then(function(res){notice.textContent='با موفقیت ثبت شد'+(res.pageId?' — صفحه '+res.pageId:'');mmLoad(MM.tab);}).catch(function(err){notice.textContent=vError(err)||err.message;}).finally(function(){button.disabled=false;}); } /* Confluence REST uses the current logged-in user and its native attachment permissions. */ function mmConfCall(path,options){return fetch(window.location.origin+'/rest/api/'+path,Object.assign({credentials:'same-origin',headers:{'Accept':'application/json'}},options||{})).then(async function(res){var raw=await res.text(),value={};try{value=raw?JSON.parse(raw):{};}catch(e){value={message:raw.slice(0,250)};}if(!res.ok)throw new Error('Confluence HTTP '+res.status+': '+(value.message||JSON.stringify(value).slice(0,350)));return value;});} function mmConfJson(path,method,body){return mmConfCall(path,{method:method,headers:{'Content-Type':'application/json','Accept':'application/json','X-Atlassian-Token':'no-check'},body:JSON.stringify(body)});} function mmConfClean(t){return String(t||'').replace(/[^\p{L}\p{N} _().،-]/gu,' ').trim().slice(0,120);} function mmConfPage(id){return mmConfCall('content/'+encodeURIComponent(id)+'?expand=space,ancestors');} function mmConfEnsure(parent,title,content){var space=parent.space.key,encoded=encodeURIComponent(title);return mmConfCall('content?spaceKey='+encodeURIComponent(space)+'&title='+encoded+'&limit=20').then(function(result){var match=(result.results||[]).find(function(p){return p.title===title;});if(match){var ancestors=match.ancestors;if(!ancestors)return mmConfPage(match.id).then(function(detail){if(!(detail.ancestors||[]).some(function(x){return String(x.id)===String(parent.id);}))throw new Error('صفحه همنام در شاخه دیگری وجود دارد: '+title);return detail;});if(!(ancestors||[]).some(function(x){return String(x.id)===String(parent.id);}))throw new Error('صفحه همنام در شاخه دیگری وجود دارد: '+title);return match;} return mmConfJson('content','POST',{type:'page',title:title,space:{key:space},ancestors:[{id:String(parent.id)}],body:{storage:{value:content||'<p> </p>',representation:'storage'}}});});} function mmConfUpload(pageId,file){if(!file)return Promise.resolve(null);if(file.size>10*1024*1024)return Promise.reject(new Error('حداکثر حجم پیوست ۱۰ مگابایت است.'));var data=new FormData();data.append('file',file,file.name);data.append('minorEdit','true');return mmConfCall('content/'+encodeURIComponent(pageId)+'/child/attachment',{method:'POST',headers:{'X-Atlassian-Token':'no-check'},body:data});} function mmConfText(s){return String(s==null?'':s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');} function mmFaMonthYear(iso){var d=new Date(iso+'T12:00:00Z');if(isNaN(+d))throw new Error('تاریخ شروع قرارداد نامعتبر است.');var parts=new Intl.DateTimeFormat('en-US-u-ca-persian',{year:'numeric',month:'2-digit',timeZone:'UTC'}).formatToParts(d);var obj={};parts.forEach(function(x){if(x.type==='year'||x.type==='month')obj[x.type]=x.value;});var names=['فروردین','اردیبهشت','خرداد','تیر','مرداد','شهریور','مهر','آبان','آذر','دی','بهمن','اسفند'];obj.monthName=names[Number(obj.month)-1]||obj.month;return obj;} /* Contract list visibility is tied to the actual published Confluence page. Never delete underlying records on a failed request (403/5xx/network). */ function mmVisibleContracts(rows){ return Promise.all((rows||[]).map(function(item){ var id=String(item.pageId||item.pageID||'').trim(); if(!id&&item.url){var match=String(item.url).match(/[?&]pageId=(\d+)/i);if(match)id=match[1];} if(!/^\d+$/.test(id))return Promise.resolve({item:item,visible:false,unlinked:true}); return fetch(window.location.origin+'/rest/api/content/'+encodeURIComponent(id)+'?expand=version',{ credentials:'same-origin',headers:{'Accept':'application/json'},cache:'no-store' }).then(function(response){ if(response.status===404||response.status===410)return {item:item,visible:false}; if(!response.ok)throw new Error('HTTP '+response.status); return response.json().then(function(page){return {item:item,visible:page.status==='current'&&page.type==='page'};}); }).catch(function(error){return {item:item,visible:true,unverified:true};}); })).then(function(results){ return {items:results.filter(function(r){return r.visible;}).map(function(r){return r.item;}), unverified:results.filter(function(r){return r.unverified;}).length, unlinked:results.filter(function(r){return r.unlinked;}).length}; }); } function mmSupplierName(key){var s=(MM.suppliers||[]).find(function(x){return x.key===key;});return s?s.name:key;} function mmCreateContractWithPage(p,file){if(!p.title||!p.supplier||!p.start||!p.contractType)return Promise.reject(new Error('عنوان، طرف قرارداد، نوع و تاریخ شروع الزامی است.')); var types={inspection:'بازرسی',maintenance:'نت',calibration:'کالیبراسیون'},name=types[p.contractType];if(!name)return Promise.reject(new Error('نوع قرارداد نامعتبر است.')); var ym=mmFaMonthYear(p.start),rootId='182714881';return mmConfPage(rootId).then(function(root){if(root.title!=='قراردادهای تعمیراتی')throw new Error('شناسه صفحه قراردادها نیاز به بررسی دارد.');return mmConfEnsure(root,'سال '+ym.year,'<p>قراردادهای سال '+ym.year+'</p>');}).then(function(year){return mmConfPage(year.id).then(function(yr){return mmConfEnsure(yr,ym.monthName,'<p>قراردادهای ماه '+ym.month+'</p>');});}).then(function(month){return mmConfPage(month.id).then(function(m){var title='قرارداد '+mmConfClean(p.number||p.title)+' - '+mmConfClean(p.title);var html='<h2>'+mmConfText(p.title)+'</h2><p>نوع: '+name+'</p><p>شماره: '+mmConfText(p.number)+'</p><p>شروع: '+mmConfText(p.start)+'</p><p>پایان: '+mmConfText(p.end)+'</p><p>طرف قرارداد: '+mmConfText(mmSupplierName(p.supplier))+'</p><p>'+mmConfText(p.coverage)+'</p>';return mmConfEnsure(m,title,html);});}).then(function(page){return mmConfUpload(page.id,file).then(function(){p.pageId=String(page.id);p.url=window.location.origin+'/pages/viewpage.action?pageId='+page.id;return mmWrite('contract.save',p).then(function(r){r.pageId=page.id;return r;});});});} function mmFindDevicePage(key){ key=String(key||'').trim(); if(!/^[A-Za-z][A-Za-z0-9_]*-[0-9]+$/.test(key))return Promise.reject(new Error('شناسه دستگاه معتبر نیست.')); var cql='type=page and title~"'+key+'"'; return mmConfCall('content/search?cql='+encodeURIComponent(cql)+'&limit=100').then(function(res){ var choices=(res.results||[]).filter(function(x){return x.title&&x.title.indexOf(key)>=0;}); if(choices.length===1)return mmConfPage(choices[0].id); if(choices.length>1)throw new Error('برای دستگاه '+key+' چند صفحه پیدا شد؛ باید یک صفحه مرجع مشخص شود.'); return mmConfPage('182714881').then(function(contracts){ var ancestor=(contracts.ancestors||[]).slice(-1)[0]; if(!ancestor)throw new Error('صفحه والد کاتالوگ تجهیزات مشخص نیست.'); return mmConfPage(ancestor.id).then(function(root){ return mmConfEnsure(root,'کاتالوگ تجهیزات پزشکی','<p>فهرست تجهیزات و اسناد فنی مدیکیو</p>'); }); }).then(function(catalog){return mmConfPage(catalog.id);}).then(function(catalog){ var row=(MM.equipment||[]).find(function(r){return r.key===key;}); var caption=mmConfClean(row?labelOf(row):key); return mmConfEnsure(catalog,key+' - '+caption,'<h2>'+mmConfText(caption)+'</h2><p>شناسه دستگاه: '+mmConfText(key)+'</p>'); }).then(function(page){return mmConfPage(page.id);}); }); } function mmCreateDocumentWithPage(p,file){if(!p.equipment||!p.title||!p.docType) return Promise.reject(new Error('دستگاه، عنوان و نوع سند الزامی است.'));var names={financial:'مالی',technical:'فنی',administrative:'اداری'},chosen=names[p.docType];if(!chosen)return Promise.reject(new Error('نوع سند نامعتبر است.')); return mmFindDevicePage(p.equipment).then(function(device){return Promise.all(['مالی','فنی','اداری'].map(function(title){return mmConfEnsure(device,title+' - '+p.equipment,'<p>اسناد '+title+' دستگاه '+mmConfText(p.equipment)+'</p>');}));}).then(function(pages){var folder=pages[['مالی','فنی','اداری'].indexOf(chosen)];return mmConfPage(folder.id);}).then(function(folder){return mmConfEnsure(folder,mmConfClean(p.title)+' - '+mmConfClean(p.equipment),'<h2>'+mmConfText(p.title)+'</h2><p>دستگاه: '+mmConfText(p.equipment)+'</p><p>نوع سند: '+chosen+'</p><p>درخواست: '+mmConfText(p.issue)+'</p>');}).then(function(page){return mmConfUpload(page.id,file).then(function(){p.pageId=String(page.id);p.url=window.location.origin+'/pages/viewpage.action?pageId='+page.id;return mmWrite('document.save',p).then(function(r){r.pageId=page.id;return r;});});});} function mmForm(content,action,fields){var attachment='<label class="mm-attachment-label">پیوست فایل<input type="file" id="mmLocalAttachment" accept=".pdf,.jpg,.jpeg,.png,.doc,.docx,.xls,.xlsx,.zip,.txt"></label>';if(action==='supplier.create')attachment='';return '<div class="mq-preview" style="margin-top:12px"><div class="mq-preview-title">ثبت اطلاعات</div><div class="v-fields">'+content+attachment+'</div><p id="mmNotice" role="status"></p><button class="mq-assets-btn primary" id="mmSubmit" type="button">ثبت</button></div>';} function mmNav(tab){ MM.tab=tab; var group=(tab==='suppliers'||tab==='evaluations')?'تعمیرکاران':(tab==='contracts'||tab==='equipment')?'حقوقی و اداری':''; var items=group==='تعمیرکاران'?[['suppliers','فهرست تعمیرکاران'],['evaluations','ارزیابی تعمیرکاران']]:[]; // The shared page breadcrumb is displayed above the content; do not render a duplicate. if(items.length){return '<div class="mm-top-tabs" role="tablist" aria-label="تعمیرکاران">'+items.map(function(item){var selected=item[0]===tab;return '<button type="button" role="tab" aria-selected="'+selected+'" class="mm-top-tab'+(selected?' active':'')+'" data-mm-side="'+item[0]+'">'+esc(item[1])+'</button>';}).join('')+'</div>';} return ''; } function mmSyncBreadcrumb(tab){ var labels={overview:'داشبورد فعالیتها',activities:'فهرست فعالیتها',plans:'برنامهریزی پیشگیرانه',em:'ثبت و پیگیری خرابی',suppliers:'فهرست تعمیرکاران',evaluations:'ارزیابی تعمیرکاران',contracts:'قراردادهای تعمیراتی',equipment:'تجهیزات و اسناد',costing:'مدیریت هزینههای نت',risk:'مدیریت ریسک'}; var path=['مدیریت تجهیزات','مدیریت نگهداری و تعمیرات']; if(tab==='suppliers'||tab==='evaluations')path.push('تعمیرکاران'); if(tab==='contracts'||tab==='equipment')path.push('حقوقی و اداری'); if(labels[tab])path.push(labels[tab]); buildBreadcrumb(path); } document.addEventListener('click',function(event){var b=event.target.closest('#mmTreeChildren [data-mm-tree]');if(b){event.preventDefault();var t=b.getAttribute('data-mm-tree');if(t==='contracts')mmLegalHome();else mmLoad(t);}},true); document.addEventListener('click',function(event){var nav=event.target.closest('[data-mm-side]');if(nav){event.preventDefault();mmLoad(nav.getAttribute('data-mm-side'));}},true); document.addEventListener('click',function(event){ if(state.screen!=='maintenance')return; var n=event.target.closest('.mq-bread-item[data-bread-label]');if(!n)return; var label=n.getAttribute('data-bread-label'); var routes={'مدیریت نگهداری و تعمیرات':'home','داشبورد فعالیتها':'overview','فهرست فعالیتها':'activities','برنامهریزی پیشگیرانه':'plans','گزارش خرابی':'em','ثبت و پیگیری خرابی':'em','تعمیرکاران':'suppliers','فهرست تعمیرکاران':'suppliers','ارزیابی تعمیرکاران':'evaluations','حقوقی و اداری':'legal','قراردادهای تعمیراتی':'contracts','تجهیزات و اسناد':'equipment','مدیریت هزینههای نت':'costing','مدیریت ریسک':'risk'}; if(label==='مدیریت تجهیزات'){event.preventDefault();event.stopPropagation();if(typeof renderHome==='function')renderHome();else mmHome();return;} if(Object.prototype.hasOwnProperty.call(routes,label)){event.preventDefault();event.stopPropagation();var route=routes[label];if(route==='home')mmHome();else if(route==='legal')mmLegalHome();else mmLoad(route);} },true); function mmTreeSync(tab){var box=document.getElementById('mmTreeChildren');if(!box)return;box.classList.toggle('open',state.screen==='maintenance');box.querySelectorAll('[data-mm-tree]').forEach(function(b){var t=b.dataset.mmTree;b.classList.toggle('active',t===tab||(t==='suppliers'&&tab==='evaluations')||(t==='contracts'&&tab==='equipment'));});} /* MediQ V48 - connected financial/risk workspaces. Data requires Jira-side mediqMaintenance action costing.list/risk.list; never invent issue records. */ function mmFinanceRisk(tab,show,fail){ var isCost=tab==='costing',title=isCost?'مدیریت هزینههای نت':'مدیریت ریسک'; var action=isCost?'costing.list':'risk.list'; var filters='<div class="mm-actionbar mq-v48-filters"><input type="search" id="mqV48Search" placeholder="جستوجوی عنوان، کلید و دستگاه"><select id="mqV48Status"><option value="all">همه مرحلهها</option></select><select id="mqV48Order"><option value="new">جدیدترین</option><option value="old">قدیمیترین</option></select><button type="button" class="mq-assets-btn" id="mqV48Reload">بهروزرسانی</button></div>'; show('<div class="mq-v48-title"><h3>'+title+'</h3>'+(isCost?'':'<p>پیش از بستن ارزیابی، فرم ارزیابی لینکشده در یادداشتهای درخواست را تکمیل کنید. بستن نهایی فقط در صورت مجاز بودن انتقال انجام میشود.</p>')+'</div><div id="mqV48Kpis" class="v-stats"></div>'+filters+'<div id="mqV48Rows" aria-live="polite">در حال دریافت اطلاعات...</div>'); var rows=[],finBucket='all'; var host=document.getElementById('mqV48Rows'),kpis=document.getElementById('mqV48Kpis'); function draw(){ if(!host||!host.isConnected)return; var q=searchNorm((document.getElementById('mqV48Search')||{}).value||''); var status=(document.getElementById('mqV48Status')||{}).value||'all'; var order=(document.getElementById('mqV48Order')||{}).value||'new'; var shown=rows.filter(function(r){return (!q||searchNorm([r.key,r.summary,r.equipment,r.status].join(' ')).includes(q))&&(status==='all'||r.status===status)&&(finBucket==='all'||(finBucket==='done'?!!r.done:!r.done));}); shown.sort(function(a,b){return (order==='old'?1:-1)*(Date.parse(a.updated||a.created||0)-Date.parse(b.updated||b.created||0));}); host.innerHTML=mmTable(['کلید','عنوان درخواست','وضعیت','مسئول','تاریخ','عملیات'],shown.map(function(r){return [esc(r.key),esc(r.summary)+(isCost&&r.entryCount?'<div class="mq-v4925-docs" style="margin-top:5px;color:#0b7865;font-size:12px"><strong>'+esc(String(r.entryCount))+' سند ثبتشده</strong> · مجموع: '+esc(Number(r.totalAmount||0).toLocaleString('fa-IR'))+' ریال</div><details style="margin-top:5px"><summary style="cursor:pointer">مشاهده اسناد</summary>'+((r.accountingEntries||[]).map(function(entry){return '<div style="padding:4px 0;border-top:1px solid #e2ebf3">'+esc(entry.title||entry.key||'سند')+' · '+esc(String(entry.amountRaw||entry.amount||'0'))+' ریال · '+esc(entry.debitAccount||'')+'</div>';}).join(''))+'</details>':'') ,esc(r.status),esc(r.assigneeName||r.assignee||'—'),esc(mmFaDate(r.created)), '<button type="button" class="mq-assets-btn" data-mq-v48-issue="'+esc(r.key)+'">'+(isCost?'مشاهده / ثبت سند':'مشاهده / اقدام')+'</button>'];})); host.querySelectorAll('[data-mq-v48-issue]').forEach(function(b){b.onclick=function(){mmIssueDetail(b.dataset.mqV48Issue).then(mmOpenIssueModal).catch(function(e){alert(vError(e));});};}); } function fetchRows(){ host.textContent='در حال دریافت اطلاعات...'; mmApi(action).then(function(payload){ if(payload&&payload.ok===false)throw Error(payload.message||'سرویس اطلاعات را برنگرداند.'); if(!payload||!Array.isArray(payload.items))throw Error('خروجی '+action+' باید دارای آرایه items باشد. برای اتصال این صفحه، عملیات '+action+' را در سرویس مدیریت تعمیرات فعال کنید.'); rows=payload.items.filter(function(r){return r&&/^MED-\d+$/.test(r.key||'');}); var statuses=Array.from(new Set(rows.map(function(r){return r.status;}).filter(Boolean))); var select=document.getElementById('mqV48Status'); select.innerHTML='<option value="all">همه مرحلهها</option>'+statuses.map(function(x){return '<option value="'+esc(x)+'">'+esc(x)+'</option>';}).join(''); var current=rows.filter(function(r){return !r.done;}).length; kpis.innerHTML='<button type="button" class="mm-kpi-card active" data-fin-filter="all"><strong>'+rows.length+'</strong><span>کل درخواستها</span></button><button type="button" class="mm-kpi-card" data-fin-filter="open"><strong>'+current+'</strong><span>در جریان</span></button><button type="button" class="mm-kpi-card" data-fin-filter="done"><strong>'+ (rows.length-current) +'</strong><span>تکمیلشده</span></button>'; kpis.querySelectorAll('[data-fin-filter]').forEach(function(btn){btn.onclick=function(){finBucket=btn.dataset.finFilter;kpis.querySelectorAll('[data-fin-filter]').forEach(function(b){b.classList.toggle('active',b===btn);});draw();};}); draw(); }).catch(function(err){kpis.innerHTML='';host.innerHTML='<div class="mq-v48-warning"><strong>اطلاعات این بخش هنوز از بکاند قابل دریافت نیست.</strong><p>'+esc(vError(err))+'</p><small>برای Costing شناسه 10601 و برای Risk Assessment شناسه 10700 را در تنظیمات سرویس بررسی کنید. اطلاعات نمایشی ساختگی اضافه نشده است.</small></div>';}); } document.getElementById('mqV48Search').oninput=draw; document.getElementById('mqV48Status').onchange=draw; document.getElementById('mqV48Order').onchange=draw; document.getElementById('mqV48Reload').onclick=fetchRows; fetchRows(); } function mmHome(){ MM.tab='home';state.screen='maintenance'; heroTitle.textContent='مدیریت نگهداری و تعمیرات'; heroDesc.textContent='داشبورد، برنامهریزی نت، خرابیها، تعمیرکاران و امور حقوقی'; buildBreadcrumb(['مدیریت تجهیزات','مدیریت نگهداری و تعمیرات']); mqTreeActivate('maintenance');mmTreeSync('home'); var cards=[ ['overview','داشبورد فعالیتها','آمار، فیلتر و گزارش فعالیتها','chart'], ['plans','برنامهریزی پیشگیرانه','برنامهریزی پیشگیرانه و بازرسی تجهیزات','calendar'], ['em','ثبت و پیگیری خرابی','ثبت خرابی و مشاهده وضعیت درخواستها','repair'], ['suppliers','تعمیرکاران','فهرست تعمیرکاران و ارزیابی تعمیرکاران','people'], ['costing','مدیریت هزینههای نت','ثبت و پیگیری اسناد هزینه','files'], ['risk','مدیریت ریسک','مشاهده و ارزیابی ریسکهای تجهیزات','files'] ]; mmRenderCards(cards,'مدیریت نگهداری و تعمیرات'); } function mmCardIcon(icon){ var shapes={ chart:'<path d="M4 19V12M10 19V7M16 19V4M3 21h18"/>', calendar:'<rect x="3" y="5" width="18" height="16" rx="2"/><path d="M7 3v4m10-4v4M3 10h18m-12 5 2 2 4-5"/>', repair:'<path d="M14 6a5 5 0 0 0 6 6l-9 9-5-5 9-9z"/><path d="M5 3l6 6"/>', people:'<circle cx="8" cy="8" r="3"/><path d="M2 20v-2a6 6 0 0 1 12 0v2M17 5a3 3 0 0 1 0 6m0 3a5 5 0 0 1 5 5"/>', files:'<path d="M4 4h8l3 3h5v13H4zM7 11h10M7 15h8"/>' }; return '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">'+(shapes[icon]||shapes.files)+'</svg>'; } function mmRenderCards(cards,title){ view.innerHTML='<section class="mm-card-home" dir="rtl"><h2>'+esc(title)+'</h2><div class="mm-category-grid">'+cards.map(function(c){return '<button type="button" class="mm-category-card" data-mm-card="'+esc(c[0])+'"><span class="mm-category-icon">'+mmCardIcon(c[3])+'</span><strong>'+esc(c[1])+'</strong><span>'+esc(c[2])+'</span><i aria-hidden="true">↙</i></button>';}).join('')+'</div></section>'; view.querySelectorAll('[data-mm-card]').forEach(function(b){b.onclick=function(){if(b.dataset.mmCard==='legal')mmLegalHome();else mmLoad(b.dataset.mmCard);};}); } function mmLegalHome(){ MM.tab='legal';state.screen='maintenance';mqTreeActivate('maintenance');mmTreeSync('legal'); heroTitle.textContent='حقوقی و اداری';heroDesc.textContent='مدیریت قراردادهای تعمیراتی و اسناد تجهیزات'; buildBreadcrumb(['مدیریت تجهیزات','مدیریت نگهداری و تعمیرات','حقوقی و اداری']); mmRenderCards([ ['contracts','قراردادهای تعمیراتی','ثبت، مدیریت و مشاهده قراردادها','files'], ['equipment','تجهیزات و اسناد','فهرست دستگاهها و مدارک تعمیراتی','repair'] ],'حقوقی و اداری'); } function mmSide(tab){var a=tab==='contracts'?[['contracts','قراردادهای تعمیراتی'],['equipment','تجهیزات و اسناد']]:tab==='suppliers'?[['suppliers','فهرست تعمیرکاران'],['evaluations','ارزیابی تعمیرکاران']]:tab==='overview'?[['overview','داشبورد فعالیتها']]:tab==='plans'?[['plans','برنامهریزی پیشگیرانه']]:[['em','ثبت و پیگیری خرابی']];return '<aside class="mm-sidebar"><strong>بخشهای مرتبط</strong>'+a.map(function(x){return '<button type="button" data-mm-side="'+x[0]+'">'+x[1]+'</button>';}).join('')+'</aside>';} function mmIsPm(r){return /^PM\s*-/i.test(r.summary||'')||/برنامه بازرسی|^Inspection\s*-/i.test(r.summary||'');} function mmActivityFilterUI(){return '<div class="mm-actionbar"><input id="mmSearch" placeholder="جستوجوی فعالیت و دستگاه"><select id="mmType"><option value="all">همه فعالیتها</option><option value="pm">برنامههای پیشگیرانه</option><option value="em">فعالیتهای اصلاحی</option></select><select id="mmStatus"><option value="all">همه مرحلهها</option><option value="open">باز</option><option value="done">تکمیلشده</option>'+Array.from(new Set((MM.activities||[]).map(function(r){return String(r.status||'').trim();}).filter(Boolean))).map(function(status){return '<option value="'+esc(status)+'">'+esc(status)+'</option>';}).join('')+'</select><select id="mmOrder"><option value="" selected>ترتیب نمایش</option><option value="new">جدیدترین</option><option value="old">قدیمیترین</option><option value="priority">مهمترین</option></select><select id="mmPriority"><option value="all">همه اهمیتها</option><option value="مسدودکننده">مسدودکننده</option><option value="بسیار مهم">بسیار مهم</option><option value="مهم">مهم</option><option value="میانه">میانه</option><option value="پایین">پایین</option><option value="جزئی">جزئی</option><option value="ناچیز">ناچیز</option><option value="نامشخص">نامشخص</option></select></div><div id="mmRows"></div>';} function mmPriorityText(r){ var raw=String(r.priorityName||r.priority||r.importance||'').trim(); if(!raw)return 'نامشخص'; var k=raw.toLowerCase().replace(/[\s_-]+/g,''); if(/blocker|مسدودکننده|مسدود/.test(k))return 'مسدودکننده'; if(/minor|جزئی|جزیی/.test(k))return 'جزئی'; if(/critical|highest|بسیارمهم|خیلیزیاد|veryhigh/.test(k))return 'بسیار مهم'; if(/major|high|important|مهم|بالا/.test(k))return 'مهم'; if(/medium|normal|moderate|میانه|متوسط|عادی/.test(k))return 'میانه'; if(/lowest|trivial|ناچیز/.test(k))return 'ناچیز'; if(/low|پایین|کم/.test(k))return 'پایین'; return raw; } function mmPriorityWeight(value){var ranks={'مسدودکننده':7,'بسیار مهم':6,'مهم':5,'میانه':4,'پایین':3,'جزئی':2,'ناچیز':1,'نامشخص':0};return ranks[mmPriorityText({priorityName:value})]||0;} function mmIsOverdue(r){if(r.overdue===true||r.isOverdue===true)return true;var due=r.due||r.dueDate||r.deadline||r.nextExecutionDate||'';var date=Date.parse(due);return mmIsPm(r)&&!r.done&&Number.isFinite(date)&&date<Date.now();} function mmWeekLate(r){if(r.done)return false;var date=Date.parse(r.created||r.createdDate||r.start||'');return Number.isFinite(date)&&Date.now()-date>7*86400000;} function mmApplyCardFilter(r){var f=MM.cardFilter||'all';if(f==='all')return !r.done;if(f==='pm')return mmIsPm(r)&&!r.done;if(f==='em')return !mmIsPm(r)&&!r.done;if(f==='done')return !!r.done;if(f==='overdue')return mmWeekLate(r);return true;} function mmEnsureDefaultPanel(){ var host=document.getElementById('mmContent');if(!host||!document.getElementById('mmRows')||host.querySelector('#mmPermanentIssue'))return; host.classList.add('mm-with-fixed-side'); var panel=document.createElement('aside');panel.id='mmPermanentIssue';panel.className='mm-permanent-panel';panel.dir='rtl'; panel.innerHTML='<header><strong>جزئیات فعالیت</strong></header><div class="mm-panel-empty"><div class="mm-panel-empty-icon">▤</div><strong>یک فعالیت را انتخاب کنید</strong><p>مشخصات، روند فعالیت و اقدامات مرتبط در این قسمت نمایش داده میشوند.</p></div>'; var heading=host.querySelector('#mmActivitiesHeading');if(heading)heading.insertAdjacentElement('afterend',panel);else{var bar=host.querySelector('.mm-actionbar');if(bar)bar.before(panel);} } function mmPaintActivities(){var host=$id('mmRows');if(!host)return;var q=($id('mmSearch')||{}).value||'',t=($id('mmType')||{}).value||'all',st=($id('mmStatus')||{}).value||'all',order=($id('mmOrder')||{}).value||'new',pri=($id('mmPriority')||{}).value||'all';var rows=(MM.activities||[]).filter(function(r){return mmApplyCardFilter(r)&&(r.key+' '+r.summary+' '+r.status).toLowerCase().includes(q.toLowerCase())&&(t==='all'||(t==='pm'===mmIsPm(r)))&&(st==='all'||(st==='done'?r.done:(st==='open'?!r.done:String(r.status||'')===st)))&&(pri==='all'||mmPriorityText(r)===pri);});if(order==='old')rows.sort(function(a,b){return Date.parse(a.created||0)-Date.parse(b.created||0);});else if(order==='new')rows.sort(function(a,b){return Date.parse(b.created||0)-Date.parse(a.created||0);});else if(order==='priority')rows.sort(function(a,b){return mmPriorityWeight(b.priorityName||b.priority)-mmPriorityWeight(a.priorityName||a.priority);});host.innerHTML=mmActivities(rows);host.querySelectorAll('tbody tr').forEach(function(tr){var k=tr.querySelector('[data-mm-issue]');if(k){tr.style.cursor='pointer';tr.onclick=function(e){if(e.target.closest('a,button'))return;mmOpenIssue(k.dataset.mmIssue);};}});} function mmDateNotPast(){var inp=$id('mm_start');if(!inp||!inp.value)return true;try{var chosen=mmIsoDate(inp.value);var now=new Date();var local=[now.getFullYear(),String(now.getMonth()+1).padStart(2,'0'),String(now.getDate()).padStart(2,'0')].join('-');if(chosen<local){$id('mmNotice').textContent='تاریخ شروع نمیتواند قبل از امروز باشد.';return false;}}catch(e){$id('mmNotice').textContent=e.message;return false;}return true;} function renderMediqMaintenance(){state.screen='maintenance';heroTitle.textContent='مدیریت نگهداری و تعمیرات';heroDesc.textContent='برنامهریزی پیشگیرانه، تعمیرات EM، پیمانکاران، قراردادها و مستندات';buildBreadcrumb(['مدیریت تجهیزات','مدیریت نگهداری و تعمیرات']);mqTreeActivate('maintenance');mmHome();} /* MEDIQ V45 - isolated self-service requests (no admin access, no internal links) */ var MUF={rows:[],notes:[],deviceRows:[],filter:'open',timer:null,lastSeen:0}; function mufFetch(action,key){ var url=MM_PROXY_ROOT+'mediqUserFaultProxy?action='+encodeURIComponent(action||'list'); if(key)url+='&key='+encodeURIComponent(key); return mmRequest(url,{method:'GET',cache:'no-store'}); } function mufCloseRequest(key){ return mmRequest(MM_PROXY_ROOT+'mediqUserFaultProxyWrite',{ method:'POST', headers:{'Content-Type':'application/json','X-Atlassian-Token':'no-check'}, body:JSON.stringify({action:'close',key:key}) }); } function mufCreate(payload){return mmRequest(MM_PROXY_ROOT+'mediqUserFaultProxyWrite',{ method:'POST',headers:{'Content-Type':'application/json','X-Atlassian-Token':'no-check'}, body:JSON.stringify(Object.assign({action:'create'},payload)) });} function mufToTs(value){ if(value==null||value==='')return 0; if(typeof value==='number')return isFinite(value)?value:0; var direct=Date.parse(String(value)); if(!isNaN(direct))return direct; var numeric=Number(value); return isFinite(numeric)?numeric:0; } /* V49.17: Only the actual final workflow STATUS counts as closed. A delivery status or Jira statusCategory=Done is not a closure confirmation. */ function mufDone(r){ if(!r)return false; var status=String(r.statusName||r.status||'').trim().replace(/[\u200c\u200e\u200f]/g,' ').replace(/\s+/g,' '); return /^(?:بسته شده|بسته|Closed|Done)$/i.test(status); } /* V49.18: The 'processed' filter includes Calculated, but actual closure remains separate. */ function mufProcessed(r){ if(!r)return false; if(mufDone(r))return true; var status=String(r.statusName||r.status||'').trim().replace(/[\u200c\u200e\u200f]/g,' ').replace(/\s+/g,' '); return /^(?:محاسبه شده|Calculated)$/i.test(status); } function mufNormalizeRow(r){r=r||{};r.done=mufDone(r);r.processed=mufProcessed(r);r.createdTs=mufToTs(r.created||r.createdDate||r.createdAt);r.updatedTs=mufToTs(r.updated||r.updatedDate||r.updatedAt||r.created);r.priorityText=r.priorityName||r.priority||r.urgency||'عادی';return r;} function mufPrettyDate(value){ var ts=mufToTs(value);if(!ts)return '—'; try{return new Intl.DateTimeFormat('fa-IR-u-ca-persian',{dateStyle:'medium',timeStyle:'short',timeZone:'Asia/Tehran'}).format(new Date(ts));}catch(e){return '—';} } function mufScoped(){return MM.tab==='em'&&state.screen==='maintenance'&&!!document.getElementById('mufRoot');} function mufRows(){ var q=searchNorm((document.getElementById('mufSearch')||{}).value||''); var f=(document.getElementById('mufStatus')||{}).value||'open'; var sort=(document.getElementById('mufSort')||{}).value||'new'; var rows=MUF.rows.filter(function(r){ return (!q||searchNorm([r.key,r.summary,r.status,r.description].join(' ')).includes(q))&& (f==='all'||(f==='open'&&!r.processed)||(f==='closed'&&r.processed)); }); rows.sort(function(a,b){ return sort==='old'?(a.createdTs-b.createdTs):sort==='priority'?String(b.priorityText||'').localeCompare(String(a.priorityText||'')):(b.updatedTs-a.updatedTs); }); return rows; } var MQ_MEDIQ_PRIORITY_ASSETS={"critical":"data:image/png;base64,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","highest":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAABACAYAAACz4p94AAARIUlEQVR42u1aeZBeVZX/nXPve9/ae3cSOpDQhGRAEAeCbGpI66AJWyllY8RRR6wJNZaIY1HFOFNjJzVMGHFlxhkLa3SKUVQ67gouKB0UCEtCtm6SbkJ3utPr19u39Le87917z/zxdSdBU5oOjaNV3Kpbr+q9e889v3vOPdt9wGvttfZae9WbQOjk70F/JgB+P6N/PkCeOFglnZ3RE5mWvXsTsndv4tVYjxeNcamokDzf24Ry/kYgugwA0NHBABCkiivsVHij7NlTe+L4PxkQAhARiXSNJ+30zHUmm76xlC3pyte2yiMIDOVzG5Cx10hvb4SIZLFUSy8GEQJE+vujGBq5lDKZd1KpdE60uWpyDoMAQKQpOu76Js53xkU4Fn1RBPvm4P/pqBOGpy92udlrMFu4GmFosX595rigALryyqyUAg+zubciM7sezx04k4hkMdSKF8MSya5dcVsILke+8AZWXAumF4lIpF2YiKSjrUNBBKTpIDM32Wx2HWaLV0mHqMVQK36Fp5kAoDSca6ZS6Q1SDppBgHhqNwDggu0EAG1zx4Kj0V1gBoLSX7h84U2of7pxXh3/X0BIhyjsfP4cANBizkYYngmIduQGXFVyJwBs/605Jh7ZY62ZgrMRhOEqmPJKAJCd+5e+Eh/Cp2lOGcu7LjEF8/rKTnILRDQpziGZ/LlXv7QLANq620Ta2xnd3QIAuqlqP1Ulfky+Hgccw7kVAIBy+Q3yVM9yAk7rjOgFm1JA8NSBNcjPbtSl4CgAQFE1oIbY10XUJB/ClRfMdLa3a9pK5tjc9nZNl18+FT725Le54G2EuIgl1AIAiqUqG7pW+c3+h4loRiBEIFl0EPMApLc3guH0pXY2/2Yph/8BAPC9WebITvjqEBqSTxCRADCZbdsaquPxM6DUKN1++xQAaCo/jqqY2DBsAagEACgEOdLmHcZXo9LZ+Ti1Hge/uOrU3l4Rcyp7psvl30JBsExbe0hEtIpFDiEZfwSP/fTXdOGFZenoUPa22z6bnEgdckOD+1z/Sz32Yx/9jHR0KGptLaHv4K9Vdc2jKub3iQiXTNgHEy7TxeCyPJoaF+rRF6BOWwBshckWLqZScDFBhuEV+9DdrXD2smexYkWJAJnevLnGPfSdb3MitgH5PBwEDGqA79/pfvSjC6S9fRN96ENZAY5gcHAUO3Zw9JzGATcwlXZBcF7CK64CMIYtWwinaLVOGQRtJSciZB/ecS5YQmH/SXr3DVZEHIgsASK33rrS9Q18nwUX2+npEJ7WxExWRMg5w9rbiMy+xwqf+MS76POfPyorVpQh4ohIzA8e3UPirrRh0CIiTxGRW1RJiAgRkWDH3hoo1hSJ9FhFOwAAGzf6BASy8cZL0d3zPS6HZ1lnDSntgQhgAgEEgWetMcrz1sYy2d8EN998E3V0PC833+wDKLuo/4znsNwSJ9HdnQAwe2zdRY2dtK1Wvj8Onwa5Rh8QQNHPfhaEV627EUcGH0SpmDQQy6wqdIkgc7ERScXKGmutJlqpp6d3yNVX30Lbt/9EAAWV6EbErVAgyk/kkwBmFxC7nbokCo8/e1bM95tRKg2j9YoRApy5aO3f8Uz6v1AswYAcE5jmABwPnAgQmScGcc4pEUYsBmqo/ggd2PtlETB+9eRZSNbUwWKQrrpw+phJX9Rkp6vLl/seiVTsGsOe87p/lfozxMTqbJiodzZeLyZRLyZeLzZeL2G8zpXjdSZMNjiTaDj2zcTqJIzVWROtsVK3VMIV59wDrhhK2Xy/t5i5xsl8BQPArl3i2eaWByRWK4ajYeglnNFxCU/ogYpZ4agIR8VxTAIvbkMvLmUVO951zIUcDSVSJXbJGQ+IiD5xnVcDgAaAzBvf1iC1S38pOiYl6LDEvpTYkwJ7MjvX06xDIZaCF5koJ2q/W9KRaSElGdZhlrVkWUuOtcyylln2JE86FBURqal7NH3FFfUA0LlIuc7vACiuet25NlrVJaQkSxymlZJpZplilklmSTHLGFMYECQbieycWbOmBUQotbSsKUYiu0MiGWUKx5hlTFXGTzDLBCuZIg6FlNho7EDx3HNXnbjuogEoNzdfZbzoaBkk40ThKJMMM8kgkwwwST+T6yeYDJNMxOPffKqtLTY33wcAufrqZDoe/8EskxwhhH1Mrr8yT44wydEKvTBPkLLvjxSam69cFCDzIi01Nb070F5hGpB+IvMSk/QwyUEmeYFJuphsF+AGmeVIVdXdYIYALICaZ0QAAjNGk8kvjDNLN8HuZ3JdTNI9R6e30s04QfK+Vygta3r3K1KtDkCBCPna+jvyWssAQbqI7D4i2c0kzzHJM0yyk8k8T5AurcID9fUfBtGx3QcAueeeuhOk6oEIh2tr7+hVSnYTZCeTfWaO1i4m2cMk+xTZwwRJe0py9TUfn6OpFuQnBGAicjPVtdv82cwnB52zeSIuA2QA2LluAFPlRHuenlR19ZvWplK/6l+5MtoyMFAqb9p0qSf0Oed750FctwH+PvKNb+yb/97d0PBOk8l8PW9MMs9kCVCECqe68pSYiFvJrEx11bamdPafRIQJcH8QhFSI2emlS69TU1M/eckaM0ukAgGFBBhUqBjA1Ihorb2DaGy8qXV09FAvEFkDBOZtb3+fcrgfTAk4CygFJ5JzIrd6jz36nflxu5ctu7Q0NfXdkglXZIgMz6mNQkWUHiBREbtKKU21jdcvmRx/eJ6/3xuKb5/zsKlc7rYRa1yKCNMATRMwg0pPA8YX6GLE7zSrVr2ldXT0UAeg1hAF9oK121Rq6hsyPp4wIyPWjKUkHBqxGBmv0hNT281Fl3xqDVHQCei1Y2O7yitXvsn6keciIjojMJkKfUxX1qIJIgxb6yaLs7eB6HdS3pOCaAMciJA2ZskYQDOVjjnikhOxPqCDaPR/mz/wN+/4q0OHZgCgbcOGhD1z1fd4ZuaTJjVhzUxaaCajaGqGOJ1RdmZGTGrSqunMVnvWqm+ub2vzAKD18OGhJevWtQaR6A+igJ4VMRlA0sc3jMYBShnTBCJ0nyQM+R0QOwAF55BW3sEAoAxgMoBkAJMXEU2swlj87rZS6YP4yldAgJOVa87DM3t+wzPpd5n0tKHZnOJ0hiSdcZLNGGSyTmVzhFxOmekpw9Mz73W/6Hxc1qxpAYCZRx8NbiqX31WOxf49QqwLIi4D2Jm5dQOAclp3wTmsPwnPJwPhAJCpqbp3Uns5EomURMiJaLAiqYpv/mCh8M9dIv6lQCiNS6/D2MiTyGYuMsWcQbmkXSmPcjBrOcixLuc1lWY5KOWtlAqQoKjLhZzhXPaNODL4VLh0aWsrYLqc899fLN5hq6ru1EopFlGhCLFIZFp7GdTW3guAdpzkYJ88E50Dd19j49ovRSM/vNfzDn3a93/xuYaaVgC4f85UmpqGO0XHJCQts6xMlllmlJIJprBMkImIvy9bX/vJKc97MWRIiimcYZYMs2QUmzKRWK1DU1e3GUTYNUf3i3WN13426nd+2vN67otEvv+lpqa/PJGvU0+p5ycQQdrb9Yk1U7n/fs8mar8qHJE0KZtitqNMMqDI9THMFJMMR+PbJy+7rBoAsmvXNqai0Z+mmaSPEQ4ockOKZESxnWQ4UUrC6uTn5yJZno+SpbPz2LrtpxsUtgM8P3kX4AFAfvXq5TZW9WshT4aJwn4m92LF69ougvQpJb2JY16b5p1Uh4jqTya/NKhY9hNslyLbo0h6FbkjhNAySZCI/1Au21B9opduA1T7YkS186Fxfvnyy4t+bGAWLD1M4X4meZ5InmYyuwmyR+vintrav36Z1Dr7o8dPIONgbe0d+5SSZyre2jw756n3M4UzBElHo3tl9YpzFhKS0ykCkPzy5ReVJiafypXL8RTDlgEVAAgBE3eiyfMGua5u05snJnZCBMXbbjs7Op3+ggNdzDZ8rlBbc0fia18bARF2NTRcH6QzXy+bsLbAZBSgdcW5mbNEtO/7gzXNyy9L9venTqVWeyogFBHswWjsIVUs3tzHFAaAFwASCmwVoMX3n/DOOuu91x4+PAQA5Vs+sE6Njn6Li8VmmBBQGvB0P1ae+R568MHnAODnZ555oZ2Y2F4OgvMyTEYD2gcQBcqrAR/JxKfOy87+SyegWyuBwukXz7bM1XnHjVnZD5hUxfnYCRExRDoTj/7P9KZN11x7+PAQCDAbr/tb1fXCL7n/SHN4dNiE4ykpHx0yGDjagr0Hdshbr9kEAO8YGuoyKy98SzEa/SUEegowE0RuHMAAYEZCc/aiVQDXAwwRTHuRn+aJ9ISIzoqogJln4/G73l8Ibv3QAw+URETZS674onqh5yul/n6dn5p2YTajyzMZCXM5nUunXWFwKI5DPd8KLnj9FijGjb27J9UNd11Xikb/m4l01jnOiPhTxHrcjzwMABOLVCggAeiRDRsi98XjX/43rYe2+f6eT9fW3jg/YPbatmXBytW/kJoGmVDRMKWjbkxH3Bj7kiZPRpXvxnTUjVbeGZusldklzdsnN1QsEYjwmaqqj23zdO+/efrIF5LJu0CE9lcr1/7R9dfHiY/TTresvixX0/BSTkWkDxweZpaDzPYwIL1KSV8ksr9PsfQQyQvMtodZekFhRnkyFUvuybS0rDmWhLW36/s2bIgspJy0YIl0zNn8doBBhOmGJe9L+fHCEZDsIYS7meRppnAXIHu0zhyoqbkJzDhQVfWBPVqXniHIE8zmWcXyHCF8CSSDnj8x3NT09hMvWTp+TwJ02sWz3wLCbSJuoLr2bi4U/nHMhsgxOQtwCJi4iCbtHZbaprbWiZG989bl8cbGdTad3m6tWVIkMh6gFWCrRFS10qLi8dvPy+X+s0NE3fxb+cKigphPSPYnk/8QKxTvedFZkydSZQIZEZMEaYpEOktnnPHeW/r7x+cBzD9/vHz5ajMx8R0ThhflCMar+AeXEMEKZpZE8j0XZ7MdHcCCgCzk4BABVkR4uBR8+ICzZpCIRggyLuKKRHomGv3qvrvuevst/f3jHYCat+/zQG4YHn4xff75V2f8yCOhQI8LzChAA0Suzzk7VCp++HSOwkKqCDJnLSTFlCkCOgWUrYjvs4KLxe66s1C4V7aCt7S1KXR0ONmy5fgmbdliO9ev162PP55uF7mhKpG4z5ZKH82KA4OcD/ggngQE3QtEsqDBbYDaDtjPJmreZoP8Q3mRBsc85sXjH2nPZL4/J1l3auuSbEnEb7fl8jZ2LqmZ+2LVjdfdOTXa0w7Q1lPNG07TjBEAuXvFijNsKnVub6m070Ege//mzd7m9vs9ZIZjCCUWFDPV5GzUFy2I6hLifhHV/iz85gCNKO/YssW2bt1qPg6cUZdMnhtdvnzvXT09uXn6r6Z1ehkQEYli39FzC0P9qyLMLVIMzqdyuYWMaRRra2DCBJwjUjqAVll43iR8b8Qpb0AiXn8Z7khi3boDqj466soBTgfAaYOQXcPxXGrwEgqKl2tjLqKgfD6CYE1EUINyCAQBUC4D5QBwUrFBvg/EYoDvwRLBKDXoIv6L8P1eo9Veqoo9PVqe6Vlz7bXBH+cvm7IVinsZRTJog1KCQhsh7aNkzBIoVU3RiEfai1A0WinVM1thDqFUAFIZp1UKnpeC5x2F5/dzNDpSJp1ZvXGjOV21OP1k6YmDVaWw1CBilkvZLIMxDcqhXpypgqO4ElcNiBJQ0THnRPMksZogHZ10LDPsRaYi9dVjW16/IrN1AReNiwrid36V2A2FJUf1TCrl19llukjFOMIyOy2BBYfViYYAFywJsAWWtr6c6VdytfXKJAEhSMUNLpQBAWj+Hu9Ubkj/KJI4FraL/AG3T8BiXya+1l5rr7WXtf8DB0cqqo/pHfUAAAAASUVORK5CYII=","high":"data:image/png;base64,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","normal":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACI0lEQVR42u3Yv2pUQRTH8e+ZuX+yLonkGSwE8wJiqyhYCqYTLEQljYJIwGYTbRRRbNPYaBWLlDbaiGCjoKBvoRZult27d+4cCzdBsMvOhbt4Pg/wm7nz58zMBWOMMcYYY4wxxhhjjDH/D2kzXBPly2HcgtBd/CJktrICFERms6UfyfmUoJM3qBdiC+gAJ9vE6dPyZl6yEYL2NSLIEdtRVBzqvEyaSp8Xd6ZPDtro3ADoZby8oqmflWezHm+ogZiwhR6Efb2U357u6S5e1mlSxGbJpv/U7FNjvIBKqCqCQJ4ovS4KvDZcBPb4lm7i0g3A2qxKR3mPcLdwZJroGFDwOHBR3y1EDage5VtZyfUmyJIqbq4OCtF5nTaBF8V+vQnQyRrwz2A8ps8KveFwvpxlgIZKNhmyKHSHXDVhgQXRnWT1pOWP1xZXVQvZWeoOiqCT+8XJsqdXQ8PxGI/ecREUB5lnNB7zUqT+ctBG5wZABzgEHT8oT/g8fqBgNWsShTsoGzaqh/lppP6a8jKUcgU4gVARr2Qlq5NfTETS5KsSlvocm4y4JnBLwc+uWd3aAgAa9ScIojjS7VmHgET50dl7gMKfnbnFcvD566zHmWSntYMw1s+ZD+e5x/fD+tC5i9DsJagDslD6cxJ0pZmzDngP6mSU1c1b2Wby92uzm8dgm5erFrKltY7u4pI9WtZQ1omySH+FjDHGGGOMMcYYY4wxxpju+Q3ioMyi7z2gLQAAAABJRU5ErkJggg==","low":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAElElEQVR42u2YW2hcRRjH/9/MnHM2m42bNC01BasvSm0FEQSx4iU+iPgmmEArWBApCSXSQNsItW4OfZDaeqPUVvFSqIomPvShzwbx1tq+FImVIoi2KqZkt0k2ezlnZj4fzuZSW6Uk2ySa+cHCHtj95jvf5f/NDOBwOBwOh8PhcDgcDofD4XA4HMsIqqu1jgGJ9R0EwCIkW1fbORYABH4YZAx2mqUXysTBf35eorbrVAFMALHaM3YfNTSu42pxWIfNZ8Cc2CfiuZllQj8IIVmVu3wvBZkNXJ78Ue/Nnppac76ei/pkh1juzh+AnznJVhyFTJ+WL43tAxGDiOeUsRwLkGCEZOWLYy9DNp5mK47Cz5yUu/MHgDnarWsFdLDEIBm5Z6KdgsznKI1ZMFsQCaSzAtXJz3TlwrPYf+cEckMKYbu+LrsDLNFJBj3nA5lte5tSmS2JbWtBQiCdFVwtPmr2Ng1N+bA4FbA+CSAZsxEMDbYGIAVmgWJBk9f4lPLXfum/MHIHwnaNHKvryLxCJ5lUX36tzK4ZEn5mC4oFDWYBCAW2BgxNxmyc7cPiBGADGADY0lmyUGQBshbEAIEUinlNwrubZeYbuWP0cYSkMcAy6d9r6EiOFULSqm/kISNT3wqRuh/FvCaQIgbIMpI1oNjS2dk+LJ4I1vpQlQrHqLFlM0oFA2YBEolttgbSlxCS2cS9el/2zeRlE3FLbOQE0A+EZL2dhefg+W+B4UGXDUjKmh0GyKCxRfHk6Cc63fo0AMx33FJdJgAnSq925HPkZ/qhy4CJk35N1NyCBJDKCkST78QNZ7YhbNfoYAkMYmque7suvwavqRfROMManvm/tRCS4DcR4uL++JXmXWCmWgMucgVMl2+SUW/7aCf84D2QyCAqaQihAAaYGYBBQ6tCtfhFXM5vxqFbfwcA9P66wpPNxxA0PYHyqAEgQEQAAWwMVFoCqMKUu+NXV36AHAuE4HqMwfruBGs97PWM3MN++lPyUrejUtAgMSN+bDVSzYpN9ReqlJ4kQSXrp4+TTK1DJX/1b4OsYlO9AF3apN9Y/XVtDQOA6+FyfQMwKwjoOb/K81Z/SH7TYyjnNcASoBld8DMScWkSYAM/cxOqEwYk5NQOCAyDdKvieOIrFY1vKh+85eK07SV7Fvjb/gDICW977+vkNT6Paq2vRa2vrbWQSgCU6IWYpRcgINUiEE+8H/12sRuDd0XznfcLG4DZ+/WQrNp2qUuo4CDACroyk+lEF5D0OwDmqYkBxJWd0aFVB66aGP+ZAMyIo0RIOuj+o92q9Mck/ZtRHb+y16f63W9SsLqAePKZ6EjbiSTrsPUQuxt3Fvj3+DJC0sixqh5uGxLlwkbEle8QrFCwNoa1tvaJEbQomOh76OID0ZG2E8ixSkr+xr38AgSgRkgaDw+p6ru3/RyNnHsElfGPKFjpkUgJEilBwUqPK8Xj0Z8/PRgdXnMuOTfUV+yW3J2Bv/VSX9BVGA668sP+1tG+Ky5V/t8wTd8TXHWnwIRlQwfLa35fhneSBIfD4XA4HA6Hw+FwOBwOh8PhcDgWhL8AvnIfxoIQFo0AAAAASUVORK5CYII=","lowest":"data:image/png;base64,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","urgent":"data:image/png;base64,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","minor":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEPElEQVR42u3YX4gVVRwH8O/vzJm5s/fuHwOh2sdegi49RPQgIq0k2GvSnRYCy6LMonYlLCrXuaMSirK1UNFabKzRH+YGPhQFvlSCBT6EBCtBBL4Zmu26e/fOv3POr4frmqnQ06xcPR+Yl8vMZX6/+Z1/P8CyLMuyLMuyLMuyLMuyLMtaHcxMzEy3VdBhyCIMv5fX/x7KRhw7t3LsdG2AB6bjoXc+Obbm2gQBq1cVtFqlTkQMAG+//+VD0nG3sjEbDOthggAJ+pMgfgaKo6/tGD157TM9nYBuIMD09BH5t7pj0nGcl6R0qSjy/9znui601tBKzSRy/uVo+/bOaiSBSo6eGkFLbNp0j7hY/P51rX9oc3txQUnXk0I4yLO0AJi9iu8xM/IsVQODa2RnuX1SJtnmdvuPpNlscplJEGXG32i1RKsV6PPpb5O12tDmpcX5pOJXpdHmx7zIn9DG1A3TfSpXW7RSx/2+mlxavJT2VfvXp9L5MIoiEwQt0ZMVEIYsoojM3qnPH3Cl+4sq8sLvq7pZlk3tfmV0/EbP7J/6Yp/nV3ZnSSev+FUvS/KHJ3aOnmjEsdMKAl3Ge8ryctsUAAzYPOdIB2BXpknn5MT4k+NhGApgRAA/mO69I6Jev8BBEEzsffezBz2v8igzs4HaAeBEA0Crx4YARVGkmZnA2FDkOYQQpFhNdqtuRETRRhVFkeleG9Xc3BwxM5HRh5mZiiIngNeFYewFQaDLWhpFOXMfAwAfPNIaZDZ3MTOSJCnA8jQA/vfLX1UvzaYmIu4kci7LsqXu/2At1qq13SHVpJ6bBJPOMhkGdRPC7JMw//eM5ykGG2ZmgJncPC91pSolAUSX33nh7CIY55kB16t4HVXc3937j4gbVIAThqEQDt0rXW+QDYMNXxyQl/4CgChqci9VAIdhKKMoMsaYn6SUbIxhEjxGRFyvX+AwDOXKYSiOY+fcuWGKoshobXYCBEdKZuDU2NhYFsexA5SzFyhtFThzpt59YRIfaa2fzbOsqPT1PbLn8Oy+IAgmul81WrldA9B7Ds3u8iqVx7I0Kfy+mstE0z29FW40YqfVCvTugzMz/QNrtrXbC6nvV/28yL9h5ve0EL+6SrERqBOcF1zXezzL0rRWG/CX25eO7X/9mS0r+4meTAAzU7PZJGDY1/3+8Wq1tn55abHwKhWXGVAqX2Jmdl1vkIRAnqZFtX/ATdPOaeGYjVg4u1j2VniVDkPErx46WquCP5DS3QoCVFFcmSyZGVK6ICIoVXyVF+3nD7zx4vxqHIZk6WOMiC8HsgzgqbcOzcw6JLexMes0850AIEhcUEqdAszsvl1Pf3e5QSKIyiv9m9EAo+4WeOWsEHtvTn56d3jw4+GpqW8rV3WGxC3dJms0Yie+QeurEcfOrd4Su250MF+piturMWpZlmVZlmVZlmVZlmVZlnWz/AMf0i8C5IeKOgAAAABJRU5ErkJggg=="}; function mqPriorityAsset(name){ var v=String(name||'').toLowerCase().trim(); if(/blocker|مسدود|بازدارنده/.test(v))return 'critical'; if(/highest|بسیار مهم|خیلی بالا/.test(v))return 'highest'; if(/urgent|فوری|اضطراری/.test(v))return 'urgent'; if(/critical|بحرانی/.test(v))return 'critical'; if(/minor/.test(v))return 'minor'; if(/lowest|trivial|ناچیز|خیلی کم/.test(v))return 'lowest'; if(/low|پایین|کم/.test(v))return 'low'; if(/high|مهم|بالا/.test(v))return 'high'; return 'normal'; } function mqPriorityImageHtml(name, cssClass){ var label=String(name||'نامشخص'); return '<img class="'+(cssClass||'mq-real-priority-icon')+'" src="'+MQ_MEDIQ_PRIORITY_ASSETS[mqPriorityAsset(label)]+'" alt="'+esc(label)+'" title="'+esc(label)+'" />'; } function mufPriorityIcon(name){return '<span class="muf-urgency-icon" title="'+esc(name||'نامشخص')+'" aria-label="فوریت '+esc(name||'نامشخص')+'">'+mqPriorityImageHtml(name,'mq-real-priority-icon')+'</span>';} function mufIcon(kind){ var icons={all:'▦',open:'🛠',closed:'✔',device:'🖥',priority:'⚑',status:'◉',notes:'🔔',user:'👤',time:'🕘'}; return '<span class="muf-icon" aria-hidden="true">'+(icons[kind]||'•')+'</span>'; } function mufWorkflowHtml(status){ var current=mmMaintenanceStage(status); var steps=[['new','ثبت و شروع'],['work','در حال انجام'],['repair','تعمیر و پیگیری'],['handover','آماده تحویل / تحویل'],['close','بستن و محاسبه']]; return '<div class="muf-workflow">'+steps.map(function(s){var cls='muf-work-step';if(s[0]===current)cls+=' current';else if(['new','work','repair','handover','close'].indexOf(s[0])<['new','work','repair','handover','close'].indexOf(current))cls+=' done';return '<div class="'+cls+'"><span class="muf-step-dot"></span><small>'+s[1]+'</small></div>';}).join('')+'</div>'; } function mufPanelEmpty(){return '<div class="muf-panel-empty"><div class="muf-panel-empty-icon">▤</div><strong>یک درخواست را انتخاب کنید</strong><p>جزئیات درخواست، روند رسیدگی و پیامهای مرتبط در این قسمت نمایش داده میشود.</p></div>';} function mufFriendlyError(err){var msg=vError(err)||'';msg=String(msg).replace(/\s*\|\s*آدرس درخواست:.*/,'');return msg;} function mufPaint(){ if(!mufScoped())return; var rows=mufRows(), all=MUF.rows||[], closed=all.filter(function(r){return r.processed;}).length, open=all.length-closed; var activeTab=(MUF.tab||'list'); var stats=document.getElementById('mufStats'); if(stats){ stats.hidden=activeTab!=='list'; stats.innerHTML=[['all','کل درخواستها',all.length,'#288cbf'],['open','خرابیهای جاری',open,'#e18f35'],['closed','خرابیهای رسیدگیشده',closed,'#18a077']].map(function(s){return '<button type="button" class="muf-kpi '+(MUF.filter===s[0]?'selected':'')+'" data-muf-kpi="'+s[0]+'" style="--kpi-color:'+s[3]+'">'+mufIcon(s[0])+'<span class="muf-kpi-text"><strong>'+s[2].toLocaleString('fa-IR')+'</strong><span>'+s[1]+'</span></span></button>';}).join(''); } var list=document.getElementById('mufList'); if(list){ list.innerHTML=rows.length?rows.map(function(r){return '<button type="button" class="muf-ticket'+(MUF.currentKey===r.key?' active':'')+'" data-muf-issue="'+esc(r.key)+'"><span class="muf-ticket-main"><strong>'+esc(r.key)+'</strong><em>'+esc(r.summary||'—')+'</em></span><span class="muf-ticket-meta"><b class="'+(r.processed?'muf-done':'muf-open')+'">'+esc(r.status||'—')+'</b><small>'+esc(mufPrettyDate(r.updated||r.updatedTs))+'</small></span></button>';}).join(''):'<div class="muf-empty">درخواستی مطابق فیلترهای انتخابشده وجود ندارد.</div>'; } var unseen=MUF.notes.filter(function(x){return (x.at||0)>MUF.lastSeen;}); var count=document.getElementById('mufUnread');if(count)count.textContent=unseen.length?'('+unseen.length.toLocaleString('fa-IR')+')':''; var notice=document.getElementById('mufNotes');if(notice){ notice.innerHTML=MUF.notes.length?MUF.notes.slice(0,60).map(function(x){ var row=(MUF.rows||[]).find(function(r){return r.key===x.issue;})||{}; var kind=x.kind==='comment'?'پیام جدید':x.kind==='mention'?'اشاره به شما':'تغییر وضعیت'; var summary=String(row.summary||'درخواست خرابی'); return '<article class="muf-note mq-v4928-notice"><div class="mq-v4928-notice-top"><strong>'+esc(kind)+' — '+esc(x.issue||'')+'</strong><small>'+esc(mufPrettyDate(x.at))+'</small></div><div class="mq-v4928-notice-sub">'+esc(summary)+'</div><p>'+esc(x.body||x.title||'')+'</p><div class="mq-v4928-notice-actions"><button type="button" class="mq-assets-btn" data-mq-v4928-notice="'+esc(x.issue||'')+'">مشاهده جزئیات در مدیکیو</button></div></article>'; }).join(''):'<div class="muf-empty">اعلان تازهای برای نمایش وجود ندارد.</div>'; notice.querySelectorAll('[data-mq-v4928-notice]').forEach(function(b){b.onclick=function(){ var key=b.getAttribute('data-mq-v4928-notice');if(!/^MED-\d+$/.test(key))return; mufActivateTab('list');MUF.filter='all';var sel=document.getElementById('mufStatus');if(sel)sel.value='all'; mufPaint();mufOpen(key);var side=document.getElementById('mufSidePanel');if(side)side.scrollIntoView({behavior:'smooth',block:'nearest'}); };}); } document.querySelectorAll('[data-muf-kpi]').forEach(function(b){b.onclick=function(){MUF.filter=b.dataset.mufKpi;var status=document.getElementById('mufStatus');if(status)status.value=MUF.filter==='all'?'all':MUF.filter==='open'?'open':'closed';mufPaint();};}); document.querySelectorAll('[data-muf-issue]').forEach(function(b){b.onclick=function(){mufOpen(b.dataset.mufIssue);};}); if(activeTab==='list' && rows.length && (!MUF.currentKey || !rows.some(function(r){return r.key===MUF.currentKey;}))){mufOpen(rows[0].key,true);} else if(activeTab!=='list'){var panel=document.getElementById('mufSidePanel');if(panel)panel.innerHTML='';} } function mufPriorityBadge(name){ var txt=String(name||'نامشخص'); return '<span class="muf-priority-badge" aria-label="فوریت '+esc(txt)+'">'+mqPriorityImageHtml(txt,'mq-real-priority-icon')+'<span>'+esc(txt)+'</span></span>'; } function mufRenderSidePanel(data){ var panel=document.getElementById('mufSidePanel');if(!panel)return; var oldCsatModal=document.getElementById('mqCsatModal');if(oldCsatModal)oldCsatModal.remove(); var r=mufNormalizeRow(data.issue||data.request||data.data||{}); var comments=data.comments||data.messages||[]; var asset=data.asset||{}; if(!asset.key){var refs=String(r.summary||'').match(/MED-[0-9]+/g)||[];var found=refs.find(function(k){return k!==r.key;});if(found)asset={key:found,label:found};} var docs=(data.attachments||[]).map(function(x){ var url=mqResolveIssueAttachmentUrl(x), label=esc(x.name||x.filename||'پیوست'); return url?'<a class="mm-doc-pill" href="'+esc(url)+'" target="_blank" rel="noopener noreferrer">📎 '+label+'</a>':'<span class="mm-doc-pill">📎 '+label+'</span>'; }).join(''); var allTransitions=data.transitions||((data.issue||{}).transitions)||[]; var closeActions=allTransitions.filter(function(t){ return /^(?:بستن|بستن درخواست|بسته شدن|Close|Close Issue|Closed)$/i.test(String(t.name||'').trim()); }); var closed=mufDone(r) || (r.processed && /^(?:محاسبه شده|Calculated)$/i.test(String(r.statusName||r.status||'').trim())); var desc=esc(r.description||'شرحی ثبت نشده است.').replace(/\n/g,'<br>'); panel.innerHTML=''+ '<div class="muf-side-head"><strong>جزئیات درخواست</strong><button type="button" id="mufPanelClose" class="muf-close-mini" aria-label="بستن پنل">×</button></div>'+ '<div class="muf-side-title compact"><h4>'+esc(r.key||'')+'</h4><p>'+esc(r.summary||'')+'</p></div>'+ '<div class="muf-side-grid muf-user-fault-facts">'+ '<div><small>وضعیت</small><strong>'+esc(r.status||'—')+'</strong></div>'+ '<div><small>فوریت</small><strong>'+mufPriorityBadge(r.priorityText||'نامشخص')+'</strong></div>'+ '<div><small>مسئول</small><strong>'+esc(r.assigneeName||r.assigneeDisplayName||r.assignee||'تخصیص داده نشده')+'</strong></div>'+ '<div><small>آخرین تغییر</small><strong>'+esc(mufPrettyDate(r.updated||r.updatedTs))+'</strong></div>'+ '</div>'+ '<div class="muf-side-box muf-user-fault-compact"><h5>روند رسیدگی</h5>'+mufWorkflowHtml(r.status||'')+'</div>'+ '<div class="muf-side-box muf-user-fault-compact"><h5>شرح خرابی</h5><div class="muf-desc-readonly">'+desc+'</div>'+(asset.key?'<small class="muf-asset-ref">دستگاه: '+esc(asset.label||asset.key)+'</small>':'')+'</div>'+ (docs?'<div class="muf-side-box muf-user-fault-compact"><h5>پیوستها</h5>'+docs+'</div>':'')+ '<div class="muf-side-box muf-user-fault-compact"><h5>پیام به کارشناس تعمیرات</h5><p class="muf-hint">پیام شما بهعنوان یادداشت داخلی روی همین درخواست ثبت میشود تا تیم تعمیرات آن را ببیند.</p><textarea id="mufTechnicianMessage" rows="3" placeholder="پیام خود را برای کارشناس تعمیرات بنویسید..."></textarea><div class="muf-inline-actions"><button class="mq-assets-btn primary" type="button" id="mufSendTechnician">ارسال پیام</button></div><p id="mufTechResult" role="status"></p></div>'+ (!r.processed?'<div class="muf-side-box muf-user-fault-compact"><h5>بستن درخواست</h5>'+ (closeActions.length?'<p class="muf-hint">در صورت تکمیل مراحل، میتوانید درخواست را ببندید.</p><button type="button" class="mq-assets-btn muf-close-action" data-muf-close="1">بستن درخواست</button>':'<div class="muf-hint">در وضعیت فعلی امکان بستن درخواست وجود ندارد.</div>')+ '<p id="mufCloseResult" role="status"></p></div>':'')+ (closed?'<div class="muf-side-box muf-user-fault-compact" id="mqCsatSideTrigger" style="display:none"><h5>رضایتسنجی خدمات تعمیرات</h5><button type="button" class="mq-assets-btn primary" id="mqCsatOpenButton">ثبت رضایتسنجی</button></div><div class="muf-side-box muf-user-fault-compact mq-v4928-survey" style="display:none"><h5>رضایتسنجی خدمات تعمیرات</h5><p class="muf-hint" id="mqCsatQuestion">لطفاً میزان رضایت خود را ثبت کنید.</p><div class="mq-v4928-rating" role="group" aria-label="امتیاز رضایت">'+[1,2,3,4,5].map(function(n){return '<button type="button" data-mq-v4928-rate="'+n+'" aria-pressed="false" title="'+n+' از ۵">'+['😠','🙁','😐','🙂','😍'][n-1]+'</button>';}).join('')+'</div><div id="mqCsatSelectedLabel" class="mq-csat-selected-label" aria-live="polite">هنوز امتیازی انتخاب نشده است.</div><div id="mqCsatCategories" class="mq-csat-categories"></div><textarea id="mqV4928SurveyNote" rows="2" maxlength="255" placeholder="توضیح شما درباره تجربه دریافت خدمات"></textarea><button type="button" class="mq-assets-btn primary" id="mqV4928SurveySave" disabled>ثبت رضایتسنجی</button><p id="mqV4928SurveyMessage" role="status"></p></div>':'')+ '<div class="muf-side-box muf-user-fault-compact"><h5>یادداشتها</h5>'+(comments.length?comments.map(function(c){return '<div class="muf-note compact"><strong>'+esc(mmCleanFullName(c.authorName||c.author||'کاربر'))+'</strong><small>'+esc(mufPrettyDate(c.created||c.at))+'</small><p>'+esc(c.body||c.text||'')+'</p></div>';}).join(''):'<div class="muf-empty">یادداشتی ثبت نشده است.</div>')+'</div>'; if(closed){ var rating=0, csatConfig=null; var surveyBox=panel.querySelector('.mq-v4928-survey'); var sideTrigger=panel.querySelector('#mqCsatSideTrigger'); var openSurveyButton=panel.querySelector('#mqCsatOpenButton'); var modal=document.createElement('div'); modal.id='mqCsatModal'; modal.className='mq-csat-modal'; modal.hidden=true; modal.setAttribute('role','dialog'); modal.setAttribute('aria-modal','true'); modal.setAttribute('aria-label','رضایتسنجی خدمات تعمیرات'); modal.innerHTML='<div class="mq-csat-modal-backdrop" data-csat-dismiss="1"></div><div class="mq-csat-modal-dialog" role="document"><header class="mq-csat-modal-header"><div><strong>رضایتسنجی خدمات تعمیرات</strong><small>نظر شما به بهبود کیفیت خدمات کمک میکند.</small></div><button type="button" class="mq-csat-modal-dismiss" data-csat-dismiss="1" aria-label="بستن پنجره">×</button></header><div class="mq-csat-modal-body"></div></div>'; modal.querySelector('.mq-csat-modal-body').appendChild(surveyBox); document.getElementById('mediq-dashboard').appendChild(modal); function closeCsatModal(){modal.hidden=true;} function openCsatModal(){if(!modal.isConnected)return;modal.hidden=false;} modal.querySelectorAll('[data-csat-dismiss]').forEach(function(b){b.addEventListener('click',closeCsatModal);}); if(openSurveyButton)openSurveyButton.addEventListener('click',openCsatModal); // Keep the modal visible only after a user opens it, or immediately after successful closure. function showCsatTrigger(label){if(sideTrigger)sideTrigger.style.display='';if(openSurveyButton)openSurveyButton.textContent=label||'ثبت رضایتسنجی';} var scoreButtons=surveyBox.querySelectorAll('[data-mq-v4928-rate]'); var submit=surveyBox.querySelector('#mqV4928SurveySave'); var feedback=surveyBox.querySelector('#mqV4928SurveyMessage'); var categoriesBox=surveyBox.querySelector('#mqCsatCategories'); var noteInput=surveyBox.querySelector('#mqV4928SurveyNote'); var selectedLabel=surveyBox.querySelector('#mqCsatSelectedLabel'); function paintRating(){ scoreButtons.forEach(function(b){ var on=Number(b.getAttribute('data-mq-v4928-rate'))===rating; b.classList.toggle('selected',on); b.setAttribute('aria-pressed',String(on)); }); if(selectedLabel)selectedLabel.textContent=rating ? 'امتیاز انتخابشده: '+Number(rating).toLocaleString('fa-IR')+' از ۵' : 'هنوز امتیازی انتخاب نشده است.'; } scoreButtons.forEach(function(b){ b.addEventListener('click',function(event){ event.preventDefault(); if(!csatConfig || csatConfig.state!=='ready')return; rating=Number(b.getAttribute('data-mq-v4928-rate')); paintRating(); }); }); function getCsat(){return mmRequest(MM_PROXY_ROOT+'mediqCsatProxy?key='+encodeURIComponent(r.key),{method:'GET',cache:'no-store'});} function csatMessage(text){if(feedback)feedback.textContent=text;} function loadCsat(retries){ getCsat().then(function(x){ if(!submit.isConnected)return; if(!x || x.ok!==true)throw new Error((x&&x.message)||'پاسخ افزونه رضایتسنجی معتبر نیست.'); if(x.state==='submitted'){ surveyBox.style.display='';submit.disabled=true; showCsatTrigger('مشاهده نتیجه رضایتسنجی'); csatMessage('رضایتسنجی شما قبلاً ثبت شده است.'+(x.rating?' امتیاز: '+Number(x.rating).toLocaleString('fa-IR')+' از ۵':'')); if(x.rating){rating=Number(x.rating);paintRating();} scoreButtons.forEach(function(b){b.disabled=true;}); noteInput.disabled=true; sessionStorage.removeItem('mediq.survey.open.'+r.key); return; } if(x.state==='pending'&&retries>0){ csatMessage('در حال آمادهسازی فرم رضایتسنجی...'); setTimeout(function(){if(submit.isConnected)loadCsat(retries-1);},1200); return; } if(x.state!=='ready'){ surveyBox.style.display='';submit.disabled=true; csatMessage(x.state==='pending'?'فرم نظرسنجی هنوز آماده نشده است.': x.state==='notClosed'?'نظرسنجی پس از بستن درخواست فعال میشود.': 'در حال حاضر ثبت نظرسنجی برای این درخواست فعال نیست.'); return; } csatConfig=x;surveyBox.style.display=''; showCsatTrigger('ثبت رضایتسنجی'); submit.disabled=false; var question=surveyBox.querySelector('#mqCsatQuestion');if(question)question.textContent=x.question||'میزان رضایت شما چقدر است؟'; noteInput.maxLength=Math.min(255,Math.max(1,Number(x.commentLimit)||255)); categoriesBox.innerHTML=(Array.isArray(x.categories)?x.categories:[]).map(function(c){ return '<label class="mq-csat-choice"><input type="checkbox" data-csat-cat="'+Number(c.id)+'"><span>'+esc(c.category||'')+'</span></label>'; }).join(''); csatMessage(''); if(sessionStorage.getItem('mediq.survey.open.'+r.key)==='1'){ sessionStorage.removeItem('mediq.survey.open.'+r.key); openCsatModal(); } }).catch(function(e){ if(!submit.isConnected)return; surveyBox.style.display='';submit.disabled=true; csatMessage('دریافت اطلاعات نظرسنجی ناموفق بود: '+mufFriendlyError(e)); }); } // Only load the real Candylio status; never submit to MediQ's local survey storage. loadCsat(4); submit.onclick=function(){ if(!csatConfig || csatConfig.state!=='ready')return; if(!rating){csatMessage('لطفاً میزان رضایت خود را انتخاب کنید.');return;} var comment=(noteInput.value||'').trim(); if(rating<=Number(csatConfig.commentRequiredBelow||0) && !comment){ csatMessage('برای این امتیاز، ثبت توضیحات الزامی است.');return; } var categories=Array.from(categoriesBox.querySelectorAll('[data-csat-cat]:checked')).map(function(el){ var id=Number(el.getAttribute('data-csat-cat')); return (csatConfig.categories||[]).find(function(c){return Number(c.id)===id;}); }).filter(Boolean).map(function(c){return {id:Number(c.id),category:String(c.category)};}); submit.disabled=true;csatMessage('در حال ثبت رضایتسنجی...'); var body={issueKey:r.key,rating:rating,token:csatConfig.token,type:csatConfig.type, comment:comment,answers:categories}; mmRequest(MM_PROXY_ROOT+'mediqCsatProxyWrite',{ method:'POST',headers:{'Content-Type':'application/json','X-Atlassian-Token':'no-check'},body:JSON.stringify(body) }).then(function(result){ // Native CSAT endpoint may return success with an empty body; proxy normalizes it. if(result && result.ok===false)throw new Error(result.message||'خطای ثبت رضایتسنجی'); return getCsat(); }).then(function(verified){ if(verified&&verified.state==='submitted'){ csatConfig=null;csatMessage('رضایتسنجی شما با موفقیت ثبت شد.');submit.disabled=true;showCsatTrigger('مشاهده نتیجه رضایتسنجی'); }else{ csatMessage('پاسخ ثبت دریافت شد اما تأیید ذخیرهسازی هنوز مشخص نیست. لطفاً بدون ثبت مجدد، صفحه را تازهسازی کنید.'); submit.disabled=true; } }).catch(function(e){ csatMessage('ثبت نظرسنجی تأیید نشد: '+mufFriendlyError(e)); // A timeout does not prove failed storage; refuse blind duplicate retry. submit.disabled=true;csatConfig=null; }); }; } var close=panel.querySelector('#mufPanelClose');if(close)close.onclick=function(){var csatModal=document.getElementById('mqCsatModal');if(csatModal)csatModal.remove();MUF.currentKey='';panel.innerHTML=mufPanelEmpty();document.querySelectorAll('[data-muf-issue]').forEach(function(x){x.classList.remove('active');});}; var msgBtn=panel.querySelector('#mufSendTechnician'); if(msgBtn)msgBtn.onclick=function(){ var text=(panel.querySelector('#mufTechnicianMessage').value||'').trim();var out=panel.querySelector('#mufTechResult'); if(!text){out.textContent='متن پیام را وارد کنید.';return;} msgBtn.disabled=true;out.textContent='در حال ارسال پیام...'; mmWrite('issue.comment',{key:r.key,body:text,visibility:'internal'}).then(function(){out.textContent='پیام ثبت شد.';mufOpen(r.key,true);}).catch(function(e){out.textContent='ثبت پیام انجام نشد: '+mufFriendlyError(e);}).finally(function(){msgBtn.disabled=false;}); }; panel.querySelectorAll('[data-muf-close]').forEach(function(button){button.onclick=function(){ if(!window.confirm('آیا از بستن این درخواست اطمینان دارید؟'))return; var out=panel.querySelector('#mufCloseResult');button.disabled=true;out.textContent='در حال بررسی و ثبت بستن درخواست...'; mufCloseRequest(r.key).then(function(result){ if(!result || result.ok!==true || result.closed!==true)throw new Error((result&&result.message)||'تأیید بستن از سرور دریافت نشد.'); // V49.30: Jira Fast-track moves Closed to Calculated immediately. // The authenticated write endpoint is authoritative, not the final status label. return mufFetch('detail',r.key).then(function(fresh){return {fresh:fresh,closeResult:result};}).catch(function(){return {fresh:{issue:Object.assign({},r,{status:result.status||'محاسبه شده'})},closeResult:result};}); }).then(function(bundle){ var fresh=bundle.fresh||{}; var issue=fresh.issue||fresh.request||fresh.data||fresh; issue=Object.assign({},issue,{key:r.key}); MUF.rows=MUF.rows.map(function(item){return item.key===r.key?mufNormalizeRow(Object.assign({},item,issue)):item;}); MUF.filter='all'; sessionStorage.setItem('mediq.survey.open.'+r.key,'1'); var statusInput=document.getElementById('mufStatus');if(statusInput)statusInput.value='all'; mufPaint(); MUF.currentKey=r.key; mufRenderSidePanel(Object.assign({},fresh,{issue:issue})); mufRefresh(); // The CSAT modal opens once the authenticated survey status becomes ready. }).catch(function(e){out.textContent='بستن درخواست انجام نشد: '+mufFriendlyError(e);button.disabled=false;}); };}); } function mufOpen(key,silent){ MUF.currentKey=key; var panel=document.getElementById('mufSidePanel');if(panel)panel.innerHTML='<div class="muf-panel-loading">در حال دریافت جزئیات درخواست...</div>'; document.querySelectorAll('[data-muf-issue]').forEach(function(x){x.classList.toggle('active',x.dataset.mufIssue===key);}); mmIssueDetail(key).catch(function(){return mufFetch('detail',key);}).then(function(data){if(!mufScoped())return;mufRenderSidePanel(data||{});}).catch(function(err){if(panel)panel.innerHTML='<div class="muf-panel-loading muf-error">'+esc(mufFriendlyError(err))+'</div>';if(!silent){var host=document.getElementById('mufMessage');if(host)host.textContent=mufFriendlyError(err);}}); } /* V49.21 - Assignee-scoped self-service inbox. Never infer ownership from reporter. */ function mufAccountKey(v){ if(v==null)return ''; if(typeof v==='object')return mufAccountKey(v.key||v.name||v.username||v.userKey||v.accountId||''); return String(v).trim().toLowerCase(); } function mufAssignedIdentity(r){ var f=r.fields||{}; return mufAccountKey(r.assigneeKey||r.assigneeUserKey||r.assigneeUsername||r.assigneeNameKey||f.assignee||r.assignee); } function mufAssigneeDisplay(r){ var f=r.fields||{}; var a=f.assignee||r.assignee; return String(r.assigneeDisplayName||r.assigneeName||(a&&typeof a==='object'?(a.displayName||a.name):'')||'').trim(); } function mufBelongsToUser(r,me){ var f=r.fields||{}; var assignee=f.assignee||r.assignee; var ids=[r.assigneeKey,r.assigneeUserKey,r.assigneeUsername, (assignee&&typeof assignee==='object'?assignee.key:''), (assignee&&typeof assignee==='object'?assignee.name:''), (assignee&&typeof assignee==='object'?assignee.accountId:'')] .map(mufAccountKey).filter(Boolean); var myIds=[me.key,me.name,me.username,me.userKey,me.accountId].map(mufAccountKey).filter(Boolean); if(ids.length)return ids.some(function(x){return myIds.indexOf(x)>=0;}); // Display names are only a fallback when BOTH login identifiers are unavailable in the row. var display=mufAssigneeDisplay(r); return !!display && !!me.displayName && searchNorm(display)===searchNorm(me.displayName); } var mufRefreshSerial=0; function mufRefresh(){ if(!mufScoped())return; var serial=++mufRefreshSerial; var msg=document.getElementById('mufMessage');if(msg)msg.textContent=''; // The self-service endpoint is server-side restricted to reporter=currentUser(). // Do not filter these reporter-owned rows by assignee again: the technician may be different. mufFetch('list').then(function(x){ if(!mufScoped()||serial!==mufRefreshSerial)return; if(!x||x.ok!==true||!Array.isArray(x.items)) throw new Error((x&&x.message)||'پاسخ سرویس درخواستهای من معتبر نیست.'); MUF.rows=x.items.map(mufNormalizeRow); MUF.notes=(Array.isArray(x.notifications)?x.notifications:[]).map(function(n){n=n||{};n.at=mufToTs(n.at||n.created||n.updated);return n;}); if(MUF.currentKey&&!MUF.rows.some(function(r){return r.key===MUF.currentKey;})){ MUF.currentKey='';var panel=document.getElementById('mufSidePanel');if(panel)panel.innerHTML=mufPanelEmpty(); } mufPaint(); }).catch(function(e){ if(serial!==mufRefreshSerial)return; MUF.rows=[];MUF.notes=[];mufPaint(); var host=document.getElementById('mufMessage');if(host)host.textContent=mufFriendlyError(e); }); } function mufActivateTab(t){ MUF.tab=t; document.querySelectorAll('#mufRoot [data-muf-tab]').forEach(function(n){n.classList.toggle('active',n.dataset.mufTab===t);}); [['list','mufPaneList'],['notes','mufPaneNotes'],['new','mufPaneNew']].forEach(function(p){var el=document.getElementById(p[1]);if(el)el.hidden=p[0]!==t;}); var stats=document.getElementById('mufStats');if(stats)stats.hidden=t!=='list'; var body=document.getElementById('mufBody');if(body)body.classList.toggle('show-side',t==='list'); if(t==='notes' || t==='new'){var msg=document.getElementById('mufMessage');if(msg)msg.textContent='';} if(t==='list')mufPaint(); } function mufBindDeviceSearch(){ var inp=document.getElementById('mufDeviceSearch'), box=document.getElementById('mufDeviceResults'), sel=document.getElementById('mufDevice'); if(!inp||!box||!sel)return; function paint(){ var q=searchNorm(inp.value.trim()); var hits=(MUF.deviceRows||[]).filter(function(x){return !q||searchNorm(labelOf(x)+' '+x.key).includes(q);}).slice(0,75); box.innerHTML=hits.map(function(x){return '<button type="button" data-muf-device="'+esc(x.key)+'">'+esc(labelOf(x))+'</button>';}).join('')||'<p>دستگاهی با این مشخصات یافت نشد.</p>'; box.hidden=false;inp.setAttribute('aria-expanded','true'); box.querySelectorAll('[data-muf-device]').forEach(function(b){b.onclick=function(){sel.value=b.dataset.mufDevice;inp.value=b.textContent;box.hidden=true;inp.setAttribute('aria-expanded','false');};}); } inp.addEventListener('focus',paint); inp.addEventListener('input',function(){sel.value='';paint();}); inp.addEventListener('keydown',function(e){if(e.key==='Escape'){box.hidden=true;inp.setAttribute('aria-expanded','false');}if(e.key==='Enter'&&!box.hidden){var first=box.querySelector('[data-muf-device]');if(first){e.preventDefault();first.click();}}}); document.addEventListener('click',function(e){if(!inp.isConnected)return;if(!e.target.closest('.muf-device-combo')){box.hidden=true;inp.setAttribute('aria-expanded','false');}},true); } function mmUserFaultScreen(show,fail){ if(MUF.timer){clearInterval(MUF.timer);MUF.timer=null;} MUF.filter='open';MUF.tab='list'; try{MUF.lastSeen=Number(localStorage.getItem('mediq.userfault.notifications.lastseen')||0);}catch(e){MUF.lastSeen=0;} show('<section id="mufRoot" dir="rtl"><div class="muf-heading"><div><h3>ثبت و پیگیری خرابی</h3><p>وضعیت درخواستهای ثبتشده، سوابق رسیدگی و اعلانهای مرتبط را مشاهده کنید.</p></div><button id="mufRefresh" class="mq-assets-btn">بهروزرسانی</button></div><div id="mufStats" class="muf-stats"></div><div class="muf-tabs"><button type="button" data-muf-tab="list" class="active">درخواستهای من</button><button type="button" data-muf-tab="notes">اعلانها <span id="mufUnread"></span></button><button type="button" data-muf-tab="new">ثبت خرابی جدید</button></div><div id="mufBody" class="muf-body show-side"><div id="mufPaneList"><div class="muf-filters"><input id="mufSearch" placeholder="جستوجوی درخواست یا دستگاه"><select id="mufStatus"><option value="open">خرابیهای جاری</option><option value="closed">خرابیهای گذشته</option><option value="all">همه درخواستها</option></select><select id="mufSort"><option value="new">آخرین تغییرات</option><option value="old">قدیمیترین</option><option value="priority">فوریت</option></select></div><div class="muf-list-shell"><div id="mufList" class="muf-list"><p>در حال دریافت درخواستها...</p></div><aside id="mufSidePanel" class="muf-side-panel">'+mufPanelEmpty()+'</aside></div></div><div id="mufPaneNotes" hidden><button type="button" id="mufMarkRead" class="mq-assets-btn">علامتگذاری اعلانها بهعنوان خواندهشده</button><div id="mufNotes"></div></div><div id="mufPaneNew" hidden><div class="muf-create"><h3>ثبت گزارش خرابی</h3><div class="muf-create-row"><label class="muf-device-label">دستگاه<div class="muf-device-combo"><input id="mufDeviceSearch" type="text" autocomplete="off" role="combobox" aria-expanded="false" aria-controls="mufDeviceResults" placeholder="نام یا شناسه دستگاه را جستوجو کنید"><div id="mufDeviceResults" class="muf-device-results" hidden></div><select id="mufDevice" tabindex="-1" aria-label="دستگاه انتخابشده" hidden><option value="">انتخاب دستگاه</option></select></div></label><div class="muf-urgency-picker"><span>فوریت</span><input type="hidden" id="mufUrgency" value="مهم"><div class="muf-priority-choices" role="group" aria-label="انتخاب فوریت">'+[['Blocker','مسدودکننده'],['بسیار مهم','بسیار مهم'],['مهم','مهم'],['میانه','میانه'],['پایین','پایین'],['ناچیز','ناچیز'],['Minor','جزئی']].map(function(v){return '<button type="button" class="muf-priority-choice'+(v[0]==='مهم'?' active':'')+'" data-muf-priority="'+esc(v[0])+'" title="'+esc(v[1])+'" aria-label="'+esc(v[1])+'" aria-pressed="'+(v[0]==='مهم'?'true':'false')+'">'+mqPriorityImageHtml(v[0],'mq-real-priority-icon')+'<small>'+esc(v[1])+'</small></button>';}).join('')+'</div></div><label>وضعیت دستگاه<select id="mufDeviceStatus"><option value="active">فعال</option><option value="down">خارج از سرویس</option></select></label><label class="muf-grow">شرح خرابی<textarea id="mufDescription" rows="2" placeholder="شرح خرابی و علائم مشاهدهشده را وارد کنید."></textarea></label><button id="mufSubmit" type="button" class="mq-assets-btn primary">ثبت درخواست</button></div><p id="mufCreateMsg" role="status"></p></div></div></div><div id="mufMessage" role="status"></div></section>'); var newFaultButton=document.querySelector('#mufRoot [data-muf-tab="new"]'); var faultHeading=document.querySelector('#mufRoot .muf-heading'); if(newFaultButton&&faultHeading){ newFaultButton.classList.add('mq-v47-newfault'); var updateButton=document.getElementById('mufRefresh'); if(updateButton){ var tools=document.createElement('div');tools.className='mq-v49-fault-toolbar'; updateButton.parentNode.insertBefore(tools,updateButton); tools.appendChild(newFaultButton);tools.appendChild(updateButton); } } document.querySelectorAll('#mufRoot [data-muf-tab]').forEach(function(b){b.onclick=function(){mufActivateTab(b.dataset.mufTab);};}); document.getElementById('mufRefresh').onclick=mufRefresh; document.getElementById('mufMarkRead').onclick=function(){MUF.lastSeen=Date.now();try{localStorage.setItem('mediq.userfault.notifications.lastseen',String(MUF.lastSeen));}catch(e){}mufPaint();}; ['mufSearch','mufStatus','mufSort'].forEach(function(id){var x=document.getElementById(id);x.oninput=x.onchange=function(){if(id==='mufStatus')MUF.filter=x.value;mufPaint();};}); document.querySelectorAll('#mufRoot [data-muf-priority]').forEach(function(btn){btn.onclick=function(){var inp=document.getElementById('mufUrgency');inp.value=btn.dataset.mufPriority;document.querySelectorAll('#mufRoot [data-muf-priority]').forEach(function(x){var selected=x===btn;x.classList.toggle('active',selected);x.setAttribute('aria-pressed',String(selected));});};}); document.getElementById('mufSubmit').onclick=function(){ var b=this,msg=document.getElementById('mufCreateMsg'); var p={device:document.getElementById('mufDevice').value,urgency:document.getElementById('mufUrgency').value,deviceStatus:document.getElementById('mufDeviceStatus').value,description:document.getElementById('mufDescription').value.trim()}; if(!p.device||!p.description){msg.textContent='لطفاً دستگاه و شرح خرابی را تکمیل کنید.';return;} b.disabled=true;msg.textContent='در حال ثبت درخواست...'; mufCreate(p).then(function(r){msg.textContent='درخواست '+(r.key||'')+' ثبت شد.';document.getElementById('mufDescription').value='';mufActivateTab('list');mufRefresh();}).catch(function(e){msg.textContent=mufFriendlyError(e);}).finally(function(){b.disabled=false;}); }; mufRefresh(); apiGet('equipment').then(function(rows){if(!mufScoped())return;MUF.deviceRows=rows;var select=document.getElementById('mufDevice');select.innerHTML='<option value="">انتخاب دستگاه</option>'+rows.map(function(r){return '<option value="'+esc(r.key)+'">'+esc(labelOf(r))+'</option>';}).join('');mufBindDeviceSearch();}).catch(function(e){var el=document.getElementById('mufCreateMsg');if(el)el.textContent='فهرست دستگاهها بارگذاری نشد: '+mufFriendlyError(e);}); MUF.timer=setInterval(function(){if(mufScoped()&&!document.hidden)mufRefresh();else if(!mufScoped()){clearInterval(MUF.timer);MUF.timer=null;}},30000); } function mmLoad(tab){MM.tab=tab;state.screen='maintenance';heroTitle.textContent='مدیریت نگهداری و تعمیرات';heroDesc.textContent='بخش '+({overview:'داشبورد فعالیتها',plans:'برنامهریزی پیشگیرانه',em:'ثبت و پیگیری خرابی',suppliers:'تعمیرکاران',evaluations:'ارزیابی تعمیرکاران',contracts:'قراردادهای تعمیراتی',equipment:'تجهیزات و اسناد',costing:'مدیریت هزینههای نت',risk:'مدیریت ریسک'}[tab]||'نگهداری و تعمیرات');mqTreeActivate('maintenance');mmTreeSync(tab);mmSyncBreadcrumb(tab);view.innerHTML=mmNav(tab)+'<div class="mm-two-pane">'+'<main class="mm-main"><div id="mmContent" class="mq-preview" style="margin-top:14px"><div class="wz-loading">در حال دریافت اطلاعات...</div></div></main></div>';view.querySelector('.mm-two-pane').classList.add('mm-full-width');view.querySelectorAll('[data-mm-side]').forEach(function(b){b.onclick=function(){mmLoad(b.dataset.mmSide);};});view.querySelectorAll('[data-mm-home]').forEach(function(b){b.onclick=mmHome;});view.querySelectorAll('[data-mm-legal]').forEach(function(b){b.onclick=function(){if(b.dataset.mmLegal==='1')mmLegalHome();else mmHome();};});var host=$id('mmContent');function show(html){if(host&&host.isConnected){host.innerHTML=html;mmBind();if($id('mmRows')){mmEnsureDefaultPanel();mmPaintActivities();}}}function fail(e){show('<p role="alert">'+esc(vError(e))+'</p>');} if(tab==='overview'||tab==='activities')mmApi('overview').then(function(x){MM.overview=x;MM.activities=x.activities||[];if(tab==='overview'){var cards=[['کل فعالیتهای جاری',MM.activities.filter(function(r){return !r.done;}).length],['فعالیتهای پیشگیرانه جاری',MM.activities.filter(function(r){return !r.done&&mmIsPm(r);}).length],['فعالیتهای اصلاحی جاری',MM.activities.filter(function(r){return !r.done&&!mmIsPm(r);}).length],['فعالیتهای تکمیلشده',MM.activities.filter(function(r){return !!r.done;}).length],['فعالیتهای تأخیرشده (بیش از یک هفته)',MM.activities.filter(mmWeekLate).length]];MM.cardFilter='all';show('<div class="v-stats">'+cards.map(function(k,i){return '<button type="button" class="mm-kpi-card'+(i===0?' active':'')+'" data-mm-kpi="'+['all','pm','em','done','overdue'][i]+'" aria-pressed="'+(i===0?'true':'false')+'"><strong>'+k[1]+'</strong><span>'+k[0]+'</span></button>';}).join('')+'</div><h3 id="mmActivitiesHeading">فعالیتها</h3>'+mmActivityFilterUI());}else show('<h3>فهرست فعالیتهای PM و EM</h3>'+mmActivityFilterUI());}).catch(fail); else if(tab==='plans')mmApi('plans').then(function(x){MM.plans=(x.items||[]).slice().sort(function(a,b){var da=Date.parse(a.next||a.nextExecutionDate||''),db=Date.parse(b.next||b.nextExecutionDate||'');return (isNaN(da)?Infinity:da)-(isNaN(db)?Infinity:db);});show('<h3 id="mmPlanListHeading">برنامههای پیشگیرانه و بازرسی</h3>'+mmTable(['برنامه','عنوان','نوع','دوره (روز)','اجرای بعدی','وضعیت','عملیات'],MM.plans.map(function(p){return [esc(p.key),esc(p.name),esc(mmKind(p.kind)),esc(p.kind==='INSPECTION'?'یکبار':p.period),esc(mmFaDate(p.next)),esc(mmPlanState(p)),mmPlanToggleBtn(p)+' <button type="button" class="mq-assets-btn" data-mm-plan-edit="'+esc(p.key)+'">ویرایش</button>'];}))+'<h3 id="mmPlanFormHeading">ایجاد برنامه پیشگیرانه / بازرسی</h3><div class="mm-plan-form">'+mmForm('<label>نوع برنامه<select id="mm_kind"><option value="PM">برنامه پیشگیرانه</option><option value="INSPECTION">برنامه بازرسی</option></select></label><label>مبنای برنامه<select id="mm_scope"><option value="DEVICE">دستگاه خاص</option><option value="MODEL">بر اساس مدل</option><option value="TITLE">عنوان دستگاه</option><option value="GROUP">بر اساس گروه</option></select></label><label>انتخاب دارایی<div class="mm-combo"><input id="mm_targetQuery" type="search" autocomplete="off" placeholder="جستوجو یا انتخاب هدف" role="combobox" aria-expanded="false" aria-controls="mm_targetOptions"><div id="mm_targetOptions" class="mm-combo-menu" hidden></div><select id="mm_target" aria-label="هدف انتخابشده" style="display:none"><option value="">انتخاب کنید</option></select></div></label>'+mmJDateField('mm_start','تاریخ شروع (شمسی)')+mmJDateField('mm_end','تاریخ پایان (شمسی)')+'<label>دوره<select id="mm_period"><option value="" disabled>انتخاب دوره</option><option value="1">روزانه</option><option value="7">هفتگی</option><option value="30">ماهانه (۳۰ روز)</option><option value="90">سهماهه (۹۰ روز)</option><option value="180">ششماهه (۱۸۰ روز)</option><option value="365">سالانه (۳۶۵ روز)</option></select></label><label>وضعیت برنامه<select id="mm_active"><option value="active">فعال</option><option value="inactive">غیرفعال</option></select></label><label>قرارداد مرتبط<select id="mm_contract"><option value="">بدون قرارداد</option></select></label>','pm.create',['kind','scope','target','start','end','period','active','contract'])+'</div>');mmScope();mmBindTargetCombo();mmApi('contracts').then(function(z){return mmVisibleContracts(z.items||[]);}).then(function(z){var s=$id('mm_contract');if(s){(z.items||[]).forEach(function(c){var op=document.createElement('option');op.value=c.id;op.textContent=c.title+' - '+(c.number||'');s.appendChild(op);});}}).catch(function(){});}).catch(fail); else if(tab==='costing'||tab==='risk')mmFinanceRisk(tab,show,fail); else if(tab==='suppliers')mmApi('suppliers').then(function(x){MM.suppliers=x.items||[];show('<h3>افزودن تعمیرکار</h3>'+mmSupplyForm()+'<h3>فهرست تأمینکنندگان و تعمیرکاران</h3><div class="mm-actionbar mm-search-spaced"><input id="mmSupplierSearch" placeholder="جستوجوی تعمیرکار"><select id="mmSupplierGroupFilter" aria-label="فیلتر گروه تأمینکننده"><option value="">همه گروهها</option>'+Array.from(new Set(MM.suppliers.map(function(s){return String(s.category||'').trim();}).filter(Boolean))).map(function(c){return '<option value="'+esc(c)+'">'+esc(c)+'</option>';}).join('')+'</select></div><div id="mmSupplierRows">'+mmTable(['نام','گروه تأمینکننده','تلفن','رابط','تلفن رابط'],MM.suppliers.map(function(s){return [esc(s.name),esc(s.category),esc(s.phone),esc(s.contact),esc(s.contactPhone)];}))+'</div>');}).catch(fail); else if(tab==='em')mmUserFaultScreen(show,fail); else if(tab==='evaluations')Promise.all([mmApi('evaluations'),mmApi('suppliers'),mmApi('overview')]).then(function(v){MM.suppliers=v[1].items;MM.activities=v[2].activities;show('<h3>ارزیابی عملکرد تعمیرکاران برای هر درخواست</h3>'+mmEvaluationDashboard(v[0].items||[])+mmTable(['تسک','تعمیرکار','امتیاز از ۵','توضیحات'],v[0].items.map(function(r){return [esc(r.issue),esc(r.supplier),esc(r.score),esc(r.note)];}))+'<h3>ارزیابی جدید</h3>'+mmForm(mmSelect('mm_issue','تسک',MM.activities.map(function(r){return {key:r.key,label:r.key+' — '+r.summary};}))+mmSelect('mm_supplier','تعمیرکار',MM.suppliers.map(function(s){return {key:s.key,label:s.name};}))+mmField('mm_score','امتیاز ۱ تا ۵','number')+mmTxt('mm_note','توضیحات'),'evaluation.save',['issue','supplier','score','note']));}).catch(fail); else if(tab==='contracts')Promise.all([mmApi('contracts').then(function(z){return mmVisibleContracts(z.items||[]);}),mmApi('suppliers')]).then(function(v){MM.suppliers=v[1].items||[];show('<h3>ثبت قرارداد</h3>'+mmForm(mmField('mm_title','عنوان')+mmSelect('mm_contractType','نوع قرارداد',[{key:'inspection',label:'بازرسی'},{key:'maintenance',label:'نت'},{key:'calibration',label:'کالیبراسیون'}])+mmField('mm_number','شماره قرارداد')+mmSelect('mm_supplier','طرف قرارداد',v[1].items.map(function(s){return {key:s.key,label:s.name};}))+mmJDateField('mm_start','شروع قرارداد (شمسی)')+mmJDateField('mm_end','پایان قرارداد (شمسی)')+mmTxt('mm_coverage','تجهیزات/خدمات تحت پوشش'),'contract.save',['title','contractType','number','supplier','start','end','coverage'])+'<h3>قراردادهای نگهداری و تعمیرات</h3>'+mmTable(['عنوان','شماره','تأمینکننده','شروع','پایان','سند'],v[0].items.map(function(r){return [esc(r.title),esc(r.number),esc(mmSupplierName(r.supplier)),esc(r.start),esc(r.end),mmLink(r.url)];}))+((v[0].unverified||v[0].unlinked)?'<p class="mm-sync-note">'+(v[0].unverified?'تأیید وضعیت '+v[0].unverified+' صفحه به دلیل خطای دسترسی یا ارتباط ممکن نشد. ':'')+(v[0].unlinked?v[0].unlinked+' رکورد بدون شناسه صفحه از فهرست پنهان شد.':'')+'</p>':'') );}).catch(fail); else if(tab==='equipment')Promise.all([apiGet('equipment'),mmApi('documents')]).then(function(v){MM.equipment=v[0];var docs=v[1].items;show('<h3>ثبت سند تعمیراتی</h3>'+mmForm(mmSelect('mm_equipment','دستگاه',MM.equipment.map(function(r){return {key:r.key,label:labelOf(r)};}))+mmField('mm_title','عنوان سند')+mmSelect('mm_docType','نوع سند',[{key:'financial',label:'مالی'},{key:'technical',label:'فنی'},{key:'administrative',label:'اداری'}])+mmField('mm_issue','شماره درخواست مرتبط (اختیاری)'),'document.save',['equipment','title','docType','issue'])+'<h3>فهرست تجهیزات و اسناد تعمیراتی</h3><input id="mmEquipSearch" class="mq-edit-search" placeholder="جستوجوی دستگاه"><div id="mmEquipRows">'+mmEquipTable(MM.equipment,docs)+'</div>');MM.documents=docs;}).catch(fail); } function mmLink(url){return /^https:\/\//i.test(url||'')?'<a href="'+esc(url)+'" target="_blank" rel="noopener noreferrer">مشاهده سند</a>':'—';} function mmActivities(rows){return mmTable(['کلید','فعالیت','اهمیت','وضعیت','مسئول','ایجاد'],rows.map(function(r){return ['<button type="button" class="mm-issue-link" data-mm-issue="'+esc(r.key)+'">'+esc(r.key)+'</button>',esc(r.summary),esc(mmPriorityText(r)),esc(r.status),esc(mmCleanFullName(r.assigneeName||r.assigneeDisplayName||r.assignee||'تخصیص داده نشده')),esc(mmFaDate(r.created))];}));} function mmShamsiToday(){return new Intl.DateTimeFormat('fa-IR-u-ca-persian',{year:'numeric',month:'2-digit',day:'2-digit',timeZone:'Asia/Tehran'}).format(new Date()).replace(/\u200e/g,'');} function mmDetailField(label,value){return '<div class="mm-detail-line"><span>'+esc(label)+'</span><strong>'+esc(value==null?'—':String(value))+'</strong></div>';} function mmIssueDetail(key){return mmApi('issue.detail',{type:key});} function mmIssueUserPicker(input,hidden){ var menu=document.createElement('div');menu.className='mm-user-menu';input.parentNode.appendChild(menu); var requestNo=0; input.oninput=function(){var q=input.value.trim();hidden.value='';var n=++requestNo;if(q.length<2){menu.innerHTML='';return;} mmApi('issue.users',{type:q}).then(function(x){if(n!==requestNo)return;menu.innerHTML=(x.items||[]).map(function(u){return '<button type="button" data-user="'+esc(u.name)+'">'+esc(u.displayName||u.name)+'</button>';}).join('');menu.querySelectorAll('button').forEach(function(b){b.onclick=function(){hidden.value=b.dataset.user;input.value=b.textContent;menu.innerHTML='';};});}).catch(function(){menu.innerHTML='';}); }; } function mmOpenIssue(key){ var r=(MM.activities||[]).find(function(x){return x.key===key;});if(!r)return; var base=document.getElementById('mediq-dashboard');if(!base)return; var old=base.querySelector('.mm-issue-overlay');if(old)old.remove(); var panel=base.querySelector('#mmPermanentIssue'); if(!panel){panel=document.createElement('aside');panel.id='mmPermanentIssue';panel.className='mm-permanent-panel';panel.dir='rtl';var content=document.getElementById('mmContent');if(content){content.classList.add('mm-with-fixed-side');var heading=content.querySelector('#mmActivitiesHeading');if(heading)heading.insertAdjacentElement('afterend',panel);else content.prepend(panel);}else base.appendChild(panel);} panel.hidden=false; panel.innerHTML='<header><strong>گزارش فعالیت '+esc(key)+'</strong><button type="button" id="mmClosePermanent" aria-label="بستن">×</button></header><p>در حال دریافت اطلاعات درخواست...</p>'; panel.querySelector('#mmClosePermanent').onclick=function(){panel.innerHTML='<header><strong>جزئیات فعالیت</strong></header><div class="mm-panel-empty">یک فعالیت را انتخاب کنید.</div>';}; mmIssueDetail(key).then(function(d){if(!panel.isConnected||panel.hidden)return;mmRenderPermanentIssue(panel,d);}).catch(function(e){panel.innerHTML='<header><strong>'+esc(key)+'</strong><button type="button" id="mmClosePermanent">×</button></header><p class="mm-error">'+esc(vError(e))+'</p>';panel.querySelector('button').onclick=function(){panel.hidden=true;};}); } function mmMaintenanceStage(status){ var x=String(status||'').trim(); if(/محاسبه|بسته|بستن|closed|calculated/i.test(x))return 'close'; if(/تحویل|ارسال به انبار|handover|deliver/i.test(x))return 'handover'; if(/تعمیر|repair/i.test(x))return 'repair'; if(/انجام|progress|working/i.test(x))return 'work'; return 'new'; } function mmMakePanelAccordion(panel){ var cards=Array.prototype.slice.call(panel.querySelectorAll(':scope > .mm-detail-card')); cards.forEach(function(card,index){ if(card.querySelector('#mmShowRequest')){card.classList.add('mm-standalone-request');return;} var h=card.querySelector(':scope > h4'); var name=h?h.textContent.trim():(index===0?'خلاصه وضعیت':'بخش اطلاعات'); if(h)h.remove(); var body=document.createElement('div');body.className='mm-accordion-body'; while(card.firstChild)body.appendChild(card.firstChild); var trigger=document.createElement('button');trigger.type='button';trigger.className='mm-accordion-toggle'; trigger.innerHTML='<span>'+name+'</span><span class="mm-accordion-chevron" aria-hidden="true">⌄</span>'; card.appendChild(trigger);card.appendChild(body); if(index<2){card.classList.add('mm-always-open');trigger.setAttribute('aria-expanded','true');body.hidden=false;trigger.disabled=true;if(index===0){trigger.remove();card.classList.add('mm-summary-card');}} else {trigger.setAttribute('aria-expanded','false');body.hidden=true;trigger.onclick=function(){body.hidden=!body.hidden;trigger.setAttribute('aria-expanded',String(!body.hidden));};} }); } function mmCleanFullName(value){return String(value||'').replace(/\s*\([^()]*\)\s*$/,'').trim();} function mmRenderPermanentIssue(panel,data){ var r=data.issue||{}, key=r.key||''; var comments=(data.comments||[]).map(function(c){return '<div class="mm-comment"><b>'+esc(mmCleanFullName(c.author||''))+'</b><small>'+esc(mmFaDate(c.created||''))+'</small><p>'+esc(c.body||'')+'</p></div>';}).join(''); var fields=(data.fields||[]).map(function(f){return mmDetailField(f.name,f.value);}).join(''); var stage=mmMaintenanceStage(r.status); var flowHtml='<div class="mm-detail-card mm-workflow"><h4>روند فعالیت</h4><div class="mm-stage-grid">'+[['new','ثبت و شروع'],['work','در حال انجام'],['repair','تعمیر و پیگیری'],['handover','آماده تحویل / تحویل'],['close','بستن و محاسبه']].map(function(a,i,all){var pos=all.findIndex(function(z){return z[0]===stage;});return '<span class="mm-stage '+(i<pos?'done':(i===pos?'current':''))+'">'+a[1]+'</span>';}).join('')+'</div></div>'; panel.innerHTML='<header><strong>گزارش فعالیت '+esc(key)+'</strong><button id="mmClosePermanent" type="button">×</button></header>'+ '<h3 class="mm-panel-summary">'+esc(r.summary||'')+'</h3><div class="mm-detail-card mm-summary-fields">'+mmDetailField('وضعیت',r.status)+mmDetailField('مسئول',mmCleanFullName(r.assignee))+mmDetailField('اهمیت',r.priority)+mmDetailField('تاریخ ایجاد',mmFaDate(r.created))+'</div>'+ flowHtml+ '<div class="mm-detail-card mm-report-section"><h4>ثبت گزارش</h4><div class="mm-report-inner"><textarea id="mmPanelReport" rows="3" placeholder="شرح اقدامات و نتیجه بررسی را وارد کنید"></textarea><button type="button" id="mmPanelReportSave" class="mq-assets-btn primary">ثبت گزارش</button><div id="mmPanelReportStatus" role="status"></div></div></div>'+ '<div class="mm-detail-card mm-handover-card"><h4>فرم تحویل دستگاه</h4><div class="mm-handover-grid"><label>نام دستگاه<input id="mmReceiptDevice" value="'+esc(r.device||r.summary||'')+'"></label><label>تاریخ تحویل<div class="mm-receipt-date"><input id="mmReceiptDate" readonly placeholder="انتخاب تاریخ" value="'+esc(mmShamsiToday())+'"><div id="mmReceiptDate_cal" class="mm-cal" hidden></div></div></label><label>تحویلدهنده<input id="mmReceiptFrom" autocomplete="off" placeholder="جستوجوی نام کاربر"><input type="hidden" id="mmReceiptFromId"></label><label>تحویلگیرنده<input id="mmReceiptTo" autocomplete="off" placeholder="جستوجوی نام کاربر"><input type="hidden" id="mmReceiptToId"></label></div><button id="mmPrintReceipt" type="button" class="mq-assets-btn primary">چاپ فرم تحویل</button></div>'+ '<div class="mm-detail-card"><button type="button" id="mmShowRequest" class="mq-assets-btn primary">اقدام</button></div>'; mmMakePanelAccordion(panel); panel.querySelector('#mmClosePermanent').onclick=function(){panel.innerHTML='<header><strong>جزئیات فعالیت</strong></header><div class="mm-panel-empty">یک فعالیت را انتخاب کنید.</div>';}; panel.querySelector('#mmPanelReportSave').onclick=function(){var message=panel.querySelector('#mmPanelReport').value.trim(),out=panel.querySelector('#mmPanelReportStatus'),button=this;if(!message){out.textContent='متن گزارش را وارد کنید.';return;}button.disabled=true;mmWrite('issue.comment',{key:key,body:message,visibility:'public'}).then(function(){out.textContent='گزارش ثبت شد.';panel.querySelector('#mmPanelReport').value='';}).catch(function(e){out.textContent=vError(e);}).finally(function(){button.disabled=false;});}; panel.querySelector('#mmReceiptDate').onclick=function(){mmReceiptCalendar();}; mmIssueUserPicker(panel.querySelector('#mmReceiptFrom'),panel.querySelector('#mmReceiptFromId')); mmIssueUserPicker(panel.querySelector('#mmReceiptTo'),panel.querySelector('#mmReceiptToId')); panel.querySelector('#mmPrintReceipt').onclick=function(){var printKey='mediq.receipt.print.'+key;var n=Number(sessionStorage.getItem(printKey)||0);if(n>=2){alert('سقف مجاز چاپ این فرم از طریق این نشست به پایان رسیده است.');return;}var get=function(n){return panel.querySelector('#'+n).value.trim();};var device=get('mmReceiptDevice'),date=get('mmReceiptDate'),from=mmCleanFullName(get('mmReceiptFrom')),to=mmCleanFullName(get('mmReceiptTo'));if(!device||!date||!get('mmReceiptFromId')||!get('mmReceiptToId')){alert('دستگاه، تاریخ و هر دو کاربر را از فهرست انتخاب کنید.');return;}if(!confirm('توجه: از این فرم فقط میتوانید ۲ بار چاپ بگیرید.\nآیا مایل به ادامه و باز کردن صفحه چاپ هستید؟'))return;var w=window.open('','_blank');if(!w){alert('مرورگر اجازه باز شدن پنجره چاپ را نداد. لطفاً Pop-up را مجاز کنید.');return;}w.document.write('<!doctype html><html lang="fa" dir="rtl"><meta charset="utf-8"><title>فرم تحویل</title><style>@page{size:A4;margin:16mm}@font-face{font-family:"MediQAttachedVazir";src:url("https://kb.h-soft.ir/download/attachments/174855060/Vazir-Regular.woff2") format("woff2"),url("https://kb.h-soft.ir/download/attachments/174855060/Vazir-Regular.woff") format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:"MediQAttachedVazir";src:url("https://kb.h-soft.ir/download/attachments/174855060/Vazir-Bold.woff2") format("woff2"),url("https://kb.h-soft.ir/download/attachments/174855060/Vazir-Bold.woff") format("woff");font-weight:700 900;font-style:normal;font-display:block}html,body,body *{font-family:"MediQAttachedVazir",Vazir,Tahoma,Arial,sans-serif!important;letter-spacing:normal!important}html{-webkit-print-color-adjust:exact;print-color-adjust:exact}body{font-size:15px}h2{font-size:22px}.statement{font-size:15px!important;line-height:2.65!important;word-spacing:normal!important}.sign b{font-size:14px!important}.sign p{font-size:14px!important}body{font-family:"MediQAttachedVazir",Vazir,Tahoma,Arial,sans-serif;direction:rtl;color:#16415c;line-height:2.5;margin:0;padding:28px;border:3px double #2b94bf;min-height:245mm;box-sizing:border-box}.brand{font-size:30px;font-weight:900;color:#268fbd;border-bottom:2px solid #d0e6f1;padding-bottom:15px}.sub{font-size:11px;color:#55788e}h2{text-align:center;margin:45px 0 35px}.statement{border:1px solid #c6deed;border-radius:12px;padding:20px;line-height:3}.sign{display:flex;gap:26px;margin-top:75px}.sign>div{flex:1;min-height:140px;border:1px solid #c6deed;border-radius:12px;padding:14px}.sign b{font-size:13px;color:#16415c}.sign p{margin-top:42px}.statement{text-align:justify;text-justify:inter-word;font-size:14px}.brand{text-align:right}.footer{font-size:10px;color:#66869a;border-top:1px solid #d1e3ed;margin-top:60px;padding-top:9px}</style><div class="brand">MediQ <span class="sub"> | مدیریت تجهیزات پزشکی</span></div><h2>صورتجلسه تحویل دستگاه</h2><p class="statement">در تاریخ '+esc(date)+' دستگاه '+esc(device)+' از خانم/آقای '+esc(from)+' تحویل گرفته شد و به خانم/آقای '+esc(to)+' تحویل داده شد.</p><div class="sign"><div><b>تحویلدهنده: '+esc(from)+'</b><p>امضا:</p></div><div><b>تحویلگیرنده: '+esc(to)+'</b><p>امضا:</p></div></div></html>');w.document.close();sessionStorage.setItem(printKey,String(n+1));if(n+1>=2)panel.querySelector('#mmPrintReceipt').disabled=true;w.focus();var runPrint=function(){if(!w.closed){w.focus();w.print();}};if(w.document.fonts&&w.document.fonts.ready){w.document.fonts.ready.then(runPrint).catch(runPrint);}else{runPrint();}}; panel.querySelector('#mmShowRequest').onclick=function(){mmOpenIssueModal(data);}; } /* MediQ V46.7: transitions are submitted ONLY after the modal validates its screen. */ function mmTransitionMeta(key){return mmRequest(MM_PROXY_ROOT+'mediqTransitionScreen?key='+encodeURIComponent(key),{method:'GET',cache:'no-store'});} function mmTransitionExecute(key,transitionId,fields,comment){ return mmRequest(MM_PROXY_ROOT+'mediqTransitionScreenWrite',{method:'POST',headers:{'Content-Type':'application/json','X-Atlassian-Token':'no-check'},body:JSON.stringify({key:key,transitionId:transitionId,fields:fields,comment:comment||''})}); } function mmTIsAsset(m){return /rlabs-customfield-default-object|insight|assets/i.test((m.schema||{}).custom||'');} function mmTField(name,meta){ var sc=meta.schema||{}, type=sc.type||'string', items=meta.allowedValues||[], req=!!meta.required; var label='<label class="mm-transition-field" data-mm-field="'+esc(name)+'"><span>'+esc(meta.name||name)+(req?' <b class="mm-t-required">*</b>':'')+'</span>'; var initial=meta.hasOwnProperty('value')?meta.value:null; if(mmTIsAsset(meta))return label+'<input data-mm-lookup="'+esc(name)+'" type="search" autocomplete="off" placeholder="نام یا شناسه را جستوجو کنید" value="'+esc(Array.isArray(initial)?initial.map(function(x){return x.label||x.name||x.key||'';}).join('، '):'')+'"><input data-mm-value="'+esc(name)+'" type="hidden"><div class="mm-t-asset-results" data-mm-results="'+esc(name)+'"></div></label>'; if((sc.system||'')==='user'||/userpicker|multiuserpicker/i.test(sc.custom||''))return label+'<input type="search" data-mm-lookup="'+esc(name)+'" autocomplete="off" placeholder="جستوجوی نام فرد"><input type="hidden" data-mm-value="'+esc(name)+'"><div class="mm-t-asset-results" data-mm-results="'+esc(name)+'"></div></label>'; if((sc.system||'')==='group'||/grouppicker/i.test(sc.custom||''))return label+'<input type="search" data-mm-lookup="'+esc(name)+'" autocomplete="off" placeholder="جستوجوی گروه"><input type="hidden" data-mm-value="'+esc(name)+'"><div class="mm-t-asset-results" data-mm-results="'+esc(name)+'"></div></label>'; if(/cascadingselect/i.test(sc.custom||'')){ var parents=items.map(function(v){return '<option value="'+esc(v.id||'')+'">'+esc(v.value||v.name||'')+'</option>';}).join(''); return label+'<select data-mm-value="'+esc(name)+'" data-mm-cascade="'+esc(name)+'"><option value="">انتخاب گزینه اصلی</option>'+parents+'</select><select data-mm-child="'+esc(name)+'"><option value="">انتخاب گزینه فرعی</option></select></label>'; } if(items.length){ var isMulti=type==='array'; if(isMulti)return label+'<div class="mm-t-checklist" data-mm-value="'+esc(name)+'">'+items.map(function(v){var id=String(v.id||v.key||v.value||v.name||'');return '<label><input type="checkbox" value="'+esc(id)+'"> '+esc(v.value||v.name||v.displayName||v.key||v.id||'')+'</label>';}).join('')+'</div></label>'; return label+'<select data-mm-value="'+esc(name)+'"><option value="">انتخاب کنید</option>'+items.map(function(v){var id=String(v.id||v.key||v.value||v.name||'');return '<option value="'+esc(id)+'">'+esc(v.value||v.name||v.displayName||v.key||v.id||'')+'</option>';}).join('')+'</select></label>'; } if(type==='array' || /select|checkboxes/i.test(sc.custom||''))return label+'<div class="mm-transition-error">گزینههای این فیلد در متادیتای مرحله ارائه نشدهاند؛ ثبت مقدار بدون انتخاب معتبر انجام نمیشود.</div></label>'; if(type==='boolean')return label+'<label class="mm-t-check"><input data-mm-value="'+esc(name)+'" type="checkbox"> بله</label></label>'; if(type==='string'||type==='number'||type==='date'||type==='datetime'||!type){ var large=/description|comment|توضیح|شرح/i.test(name+' '+(meta.name||'')); if(type==='date'){ var fid='mmTDate_'+String(name).replace(/[^a-z0-9]/gi,'_'); return label+'<span class="mm-date-line"><input id="'+fid+'" data-mm-value="'+esc(name)+'" data-mm-jalali-date="1" type="text" inputmode="none" readonly autocomplete="off" dir="ltr" placeholder="انتخاب تاریخ شمسی"><span id="'+fid+'_cal" class="mm-cal" hidden></span></span></label>'; } return label+(large?'<textarea rows="3" data-mm-value="'+esc(name)+'"></textarea>':'<input data-mm-value="'+esc(name)+'" type="'+(type==='number'?'number':type==='datetime'?'datetime-local':'text')+'">')+'</label>'; } return label+'<div class="mm-transition-error">نوع این فیلد در رابط فعلی پشتیبانی نمیشود؛ از ثبت مقدار حدسی جلوگیری شد.</div></label>'; } function mmTGather(overlay,tr){ var values={}, fields=tr.fields||{}; Object.keys(fields).forEach(function(name){ if(name==='comment'||name==='attachment')return; // Attachment is uploaded separately; transition metadata has no set operation. var m=fields[name],sc=m.schema||{}, el=overlay.querySelector('[data-mm-value="'+name+'"]'); if(!el){if(m.required)throw Error('فیلد الزامی «'+(m.name||name)+'» پشتیبانی نمیشود.');return;} var list=el.classList&&el.classList.contains('mm-t-checklist'); var value=list?Array.from(el.querySelectorAll('input:checked')).map(function(c){return c.value;}):el.type==='checkbox'?el.checked:String(el.value||'').trim(); if(m.required&&(value===''||value===null||(Array.isArray(value)&&!value.length)))throw Error('تکمیل فیلد «'+(m.name||name)+'» الزامی است.'); if(value==='' || (Array.isArray(value)&&!value.length))return; if(/cascadingselect/i.test(sc.custom||'')){var child=overlay.querySelector('[data-mm-child="'+name+'"]');value={id:value};if(child&&child.value)value.child={id:child.value};} else if(mmTIsAsset(m))value=[{key:value}]; else if((sc.system||'')==='user'||/userpicker/i.test(sc.custom||''))value=(sc.type==='array'?[{name:value}]:{name:value}); else if((sc.system||'')==='group'||/grouppicker/i.test(sc.custom||''))value={name:value}; else if(list)value=value.map(function(x){return (sc.items&&sc.items.type==='string')?x:{id:x};}); else if(el.tagName==='SELECT')value={id:value}; else if(sc.type==='number')value=Number(value); else if(el.hasAttribute('data-mm-jalali-date'))value=parseJalali(value,false); else if(sc.type==='datetime')value=value+':00.000+0330'; values[name]=value; }); return values; } function mmTransitionLookup(key,field,q){return mmRequest(MM_PROXY_ROOT+'mediqTransitionLookup?key='+encodeURIComponent(key)+'&field='+encodeURIComponent(field)+'&q='+encodeURIComponent(q),{method:'GET',cache:'no-store'});} function mmOpenTransitionDialog(modal,meta,tid,issueKey,onAccept,inlineHost){ document.querySelectorAll('.mm-t-screen-overlay').forEach(function(x){x.remove();}); var tr=(meta.transitions||[]).find(function(x){return String(x.id)===String(tid);}); if(!tr)throw Error('اطلاعات این مرحله از سرویس دریافت نشده است.'); var fields=tr.fields||{},names=Object.keys(fields).filter(function(k){return k!=='comment' && k!=='attachment';}); var overlay=document.createElement('div');overlay.className='mm-t-screen-overlay';overlay.dir='rtl'; overlay.innerHTML='<div class="mm-t-screen-backdrop"></div><section class="mm-t-screen-card" role="dialog" aria-modal="true" aria-labelledby="mmTTitle"><header><div><strong id="mmTTitle">'+esc(tr.name)+'</strong><p>اطلاعات موردنیاز این مرحله را تکمیل کنید.</p></div><button class="mm-t-x" type="button" aria-label="بستن">×</button></header><div class="mm-t-screen-body">'+ (names.length?'<div class="mm-transition-grid">'+names.map(function(k){return mmTField(k,fields[k]);}).join('')+'</div>':'<p class="mm-t-empty">برای این انتقال فیلد اضافی تعریف نشده است.</p>')+ (fields.attachment?'<p class="mm-t-empty" style="font-size:12px;color:#53768b;margin:8px 0">پیوست فایل در این مرحله از طریق فرم انتقال قابل ثبت نیست. در صورت نیاز، فایل را از بخش پیوستهای درخواست اضافه کنید.</p>':'')+ '<label class="mm-transition-field mm-t-comment"><span>توضیحات انتقال '+(fields.comment&&fields.comment.required?'(الزامی)':'(اختیاری)')+'</span><textarea id="mmTransitionComment" rows="3" placeholder="در صورت نیاز، توضیحات مربوط به این اقدام را وارد کنید."></textarea></label><p class="mm-t-screen-error" role="alert"></p></div><footer><button class="mm-t-cancel" type="button">انصراف</button><button class="mm-t-ok" type="button">تأیید اطلاعات مرحله</button></footer></section>'; if(inlineHost){overlay.classList.add('mq-v49-transition-inline');inlineHost.replaceChildren(overlay);}else{document.body.appendChild(overlay);} function close(){overlay.remove();} overlay.querySelector('.mm-t-x').onclick=close;overlay.querySelector('.mm-t-cancel').onclick=close;overlay.querySelector('.mm-t-screen-backdrop').onclick=close; overlay.querySelectorAll('[data-mm-jalali-date]').forEach(function(inp){ inp.onclick=function(e){e.stopPropagation();mmCalendar(inp.id);}; inp.onkeydown=function(e){if(e.key==='Enter'||e.key===' '){e.preventDefault();mmCalendar(inp.id);}}; }); overlay.querySelectorAll('[data-mm-cascade]').forEach(function(parent){ var field=parent.getAttribute('data-mm-cascade'),child=overlay.querySelector('[data-mm-child="'+field+'"]'); parent.onchange=function(){ var m=fields[field]||{}, selected=(m.allowedValues||[]).find(function(v){return String(v.id)===parent.value;}); child.innerHTML='<option value="">انتخاب گزینه فرعی</option>'+(selected&&selected.children||[]).map(function(v){return '<option value="'+esc(v.id||'')+'">'+esc(v.value||v.name||'')+'</option>';}).join(''); }; }); overlay.querySelectorAll('[data-mm-lookup]').forEach(function(inp){ var field=inp.getAttribute('data-mm-lookup'), result=overlay.querySelector('[data-mm-results="'+field+'"]'),hidden=overlay.querySelector('[data-mm-value="'+field+'"]'),serial=0,timer; function lookup(){var mine=++serial;hidden.value='';result.textContent='در حال دریافت فهرست...'; mmTransitionLookup(issueKey,field,inp.value.trim()).then(function(d){ if(!overlay.isConnected||mine!==serial)return;result.textContent='';var rows=d.items||[]; if(!rows.length){result.textContent='موردی پیدا نشد.';return;} rows.slice(0,40).forEach(function(item){var btn=document.createElement('button');btn.type='button';btn.textContent=item.label||item.key;btn.onclick=function(){hidden.value=item.key;inp.value=item.label||item.key;result.textContent='';};result.appendChild(btn);}); }).catch(function(e){if(mine===serial)result.textContent='جستوجو ناموفق بود: '+vError(e);}); } inp.addEventListener('input',function(){hidden.value='';clearTimeout(timer);timer=setTimeout(lookup,280);});inp.addEventListener('focus',lookup); }); overlay.querySelector('.mm-t-ok').onclick=function(){ var err=overlay.querySelector('.mm-t-screen-error');err.textContent=''; try{var values=mmTGather(overlay,tr),comment=overlay.querySelector('#mmTransitionComment').value.trim();if(fields.comment&&fields.comment.required&&!comment)throw Error('تکمیل توضیحات انتقال الزامی است.');onAccept(values,comment);close();} catch(e){err.textContent=e.message;} }; } /* MEDIQ V49.10: resolve request attachment links on the file-owning server. */ function mqResolveIssueAttachmentUrl(a) { if (!a || typeof a !== 'object') return ''; var raw = String(a.url || a.downloadUrl || a.content || '').trim(); var id = String(a.id || '').trim(); if (!/^\d+$/.test(id)) { var match = raw.match(/\/(?:secure\/attachment|rest\/api\/2\/attachment\/content)\/(\d+)(?:\/|[?#]|$)/i); if (match) id = match[1]; } var name = String(a.name || a.filename || 'attachment').trim(); if (/^\d+$/.test(id)) { return 'https://support.h-soft.ir/secure/attachment/' + encodeURIComponent(id) + '/' + encodeURIComponent(name); } // Never send attachment requests to the content portal by accident. if (/^https:\/\/support\.h-soft\.ir\/(?:secure\/attachment|rest\/api\/2\/attachment\/content)\//i.test(raw)) return raw; return ''; } function mmOpenIssueModal(data){ var r=data.issue||{}; document.querySelectorAll('.mm-request-modal').forEach(function(x){x.remove();}); var modal=document.createElement('div');modal.className='mm-request-modal';modal.dir='rtl'; var asset=data.asset||{}; if(!asset.key){var refs=String(r.summary||'').match(/MED-[0-9]+/g)||[];var found=refs.find(function(k){return k!==r.key;});if(found){asset={key:found,label:found};}} var choices=(data.transitions||[]).map(function(t){return '<option value="'+esc(t.id)+'">'+esc(t.name)+'</option>';}).join(''); var noTransitions=!((data.transitions||[]).length); var docs=(data.attachments||[]).map(function(a){ var url=mqResolveIssueAttachmentUrl(a); var name=esc(a.name||a.filename||'فایل پیوست'); return url ? '<a class="mm-doc-pill" target="_blank" rel="noopener noreferrer" href="'+esc(url)+'" title="نمایش پیوست">📎 '+name+'</a>' : '<span class="mm-doc-pill" title="نشانی معتبر برای این پیوست دریافت نشده است">📎 '+name+' (لینک نامعتبر)</span>'; }).join(''); modal.innerHTML='<div class="mm-request-backdrop"></div><section class="mm-request-box"><header><h3>مشخصات درخواست <span dir="ltr">'+esc(r.key)+'</span></h3><button id="mmCloseModal" type="button" aria-label="بستن">×</button></header><div class="mm-request-body">'+ '<div class="mm-form-section"><h4>اطلاعات درخواست</h4><div class="mm-request-grid"><label>عنوان درخواست<input readonly id="mmEditSummary" value="'+esc(r.summary||'')+'"></label><label>مسئول<input id="mmEditAssignee" autocomplete="off" placeholder="جستوجوی نام مسئول"><input id="mmEditAssigneeId" type="hidden" value="'+esc(r.assigneeKey||'')+'"></label><label>اهمیت<select id="mmEditPriority"><option value="">بدون تغییر</option>'+((data.priorities||[]).map(function(p){return '<option value="'+esc(p.id)+'" '+(p.name===r.priority?'selected':'')+'>'+esc(p.name)+'</option>';}).join(''))+'</select></label><label>تغییر وضعیت<select id="mmNextTransition"><option value="">انتخاب تغییر وضعیت</option>'+choices+'</select></label><label class="mm-wide">شرح درخواست<textarea readonly id="mmEditDescription" rows="3">'+esc(r.description||'')+'</textarea></label></div><div class="mm-actions"><button id="mmSaveIssue" type="button" class="mq-assets-btn primary">ثبت اقدام</button></div><p id="mmSaveIssueResult" role="status"></p>'+''+'</div>'+ '<div class="mm-form-section mm-related-asset"><h4>دستگاه</h4><button id="mmAssetButton" type="button" class="mm-asset-button" '+(!asset.key?'disabled':'')+'>'+esc(asset.label||asset.key||'دستگاه مرتبط ثبت نشده')+'</button><div id="mmAssetTickets" hidden></div></div>'+ (String(r.issueTypeId||'')==='10700'&&noTransitions?'<div class="mm-form-section" role="status" style="background:#fff9ed;border-color:#f4d7a2"><strong>پیشنیاز بستن ارزیابی ریسک</strong><p>ابتدا فرم ارزیابی پیوندشده در یادداشتهای پایین را تکمیل کنید. تا زمانی که مرحله بستن توسط گردش کار برای شما مجاز نشود، امکان بستن وجود ندارد.</p></div>':'')+ '<div class="mm-form-section"><h4>یادداشتها</h4><div id="mmCommentList">'+((data.comments||[]).map(function(c){var note=esc(c.body||'');note=note.replace(/https:\/\/[^\s<]+/g,function(link){return '<a href="'+link+'" target="_blank" rel="noopener noreferrer">'+link+'</a>';});return '<div class="mm-comment"><strong>'+esc(mmCleanFullName(c.author||''))+'</strong><p>'+note+'</p></div>';}).join('')||'')+'</div><label>ثبت یادداشت<textarea id="mmNewComment" rows="3" placeholder="متن پیام را وارد کنید"></textarea></label><input id="mmCommentVisibility" type="hidden" value="public"><div class="mm-comment-actions"><button id="mmSendCommentInternal" class="mq-assets-btn" type="button">ثبت یادداشت داخلی</button><button id="mmSendComment" class="mq-assets-btn primary" type="button">یادداشت برای مشتری</button></div><p id="mmCommentResult" role="status"></p></div>'+ '<div class="mm-compact-attachments"><h4>پیوستها</h4><div class="mm-documents">'+(docs||'<p class="mm-hint">پیوستی ثبت نشده است.</p>')+'</div><div class="mm-attach-controls"><label class="mm-attach-trigger"><span class="mm-file-label">انتخاب فایل</span><input id="mmIssueFile" type="file" aria-label="انتخاب فایل پیوست"></label><button id="mmUploadIssue" class="mq-assets-btn" type="button" disabled hidden>بارگذاری فایل</button></div></div></div></section>'; document.body.appendChild(modal); var uploadInput=modal.querySelector('#mmIssueFile'); var uploadButton=modal.querySelector('#mmUploadIssue'); var uploadMessage=document.createElement('div');uploadMessage.className='mm-upload-message';uploadMessage.setAttribute('role','status'); uploadButton.insertAdjacentElement('afterend',uploadMessage); uploadButton.hidden=false;uploadButton.disabled=true;uploadButton.textContent='افزودن پیوست'; uploadInput.addEventListener('change',function(){ uploadButton.disabled=!(uploadInput.files&&uploadInput.files.length); uploadMessage.textContent=uploadInput.files&&uploadInput.files[0]?'فایل انتخاب شد؛ برای بارگذاری «افزودن پیوست» را بزنید.':''; }); uploadButton.onclick=function(){ var file=uploadInput.files&&uploadInput.files[0];if(!file)return; if(file.size>6291456){uploadMessage.textContent='حجم فایل نباید بیشتر از ۶ مگابایت باشد.';return;} uploadButton.disabled=true;uploadMessage.textContent='در حال بارگذاری فایل...'; var reader=new FileReader(); reader.onerror=function(){uploadMessage.textContent='خواندن فایل ناموفق بود.';uploadButton.disabled=false;}; reader.onload=function(){ var content=String(reader.result||'').split(',')[1]||''; mmWrite('issue.attachment',{key:r.key,filename:file.name,contentType:file.type||'application/octet-stream',base64:content}) .then(function(result){ if(!result||result.ok!==true)throw Error(result&&result.message||'ثبت پیوست تأیید نشد.'); uploadMessage.textContent='پیوست با موفقیت ثبت شد.'; uploadInput.value=''; return mmIssueDetail(r.key).then(function(fresh){ if(!modal.isConnected)return; var list=modal.querySelector('.mm-documents'); if(list)list.innerHTML=(fresh.attachments||[]).map(function(a){var url=mqResolveIssueAttachmentUrl(a);var name=esc(a.name||a.filename||'پیوست');return url?'<a class="mm-doc-pill" href="'+esc(url)+'" target="_blank" rel="noopener noreferrer">📎 '+name+'</a>':'<span class="mm-doc-pill">'+name+'</span>';}).join('')||'پیوستی ثبت نشده است.'; }); }).catch(function(err){uploadMessage.textContent='بارگذاری ناموفق بود: '+(err&&err.message?String(err.message).slice(0,180):'خطای ارتباط با سرویس');}) .finally(function(){uploadButton.disabled=false;}); }; reader.readAsDataURL(file); }; var formSections=modal.querySelectorAll('.mm-request-body > .mm-form-section'); var attachSection=modal.querySelector('.mm-compact-attachments'); var relatedSection=modal.querySelector('.mm-related-asset'); if(attachSection&&relatedSection)relatedSection.parentNode.insertBefore(attachSection,relatedSection); var firstSection=modal.querySelector('.mm-request-body > .mm-form-section');if(attachSection&&firstSection){firstSection.querySelector('.mm-request-grid').appendChild(attachSection);} var originalFields={summary:r.summary||'',description:r.description||'',assignee:r.assigneeKey||'',priority:(modal.querySelector('#mmEditPriority')||{}).value||''}; function hasUnsaved(){return modal.querySelector('#mmEditSummary').value!==originalFields.summary||modal.querySelector('#mmEditDescription').value!==originalFields.description||modal.querySelector('#mmEditAssigneeId').value!==originalFields.assignee||modal.querySelector('#mmEditPriority').value!==originalFields.priority||!!modal.querySelector('#mmNextTransition').value;} function safeClose(){var ask=modal.querySelector('#mmConfirmDiscard');if(ask){ask.hidden=false;}} modal.querySelector('#mmCloseModal').onclick=safeClose;modal.querySelector('.mm-request-backdrop').onclick=safeClose; var acts=modal.querySelector('.mm-actions');acts.insertAdjacentHTML('beforeend','<button id="mmCancelIssue" type="button" class="mq-assets-btn">انصراف</button>');modal.querySelector('#mmCancelIssue').onclick=safeClose; modal.querySelector('.mm-request-box').insertAdjacentHTML('beforeend','<div id="mmConfirmDiscard" class="mm-discard-overlay" hidden><div class="mm-discard-card"><strong>تغییرات ذخیرهنشده</strong><p>تغییرات این فرم ذخیره نشدهاند. آیا از بستن فرم بدون ذخیره تغییرات اطمینان دارید؟</p><div><button type="button" id="mmDiscardYes" class="mq-assets-btn">بستن بدون ذخیره</button><button type="button" id="mmDiscardNo" class="mq-assets-btn primary">ادامه ویرایش</button></div></div></div>'); modal.querySelector('#mmDiscardYes').onclick=function(){modal.remove();};modal.querySelector('#mmDiscardNo').onclick=function(){modal.querySelector('#mmConfirmDiscard').hidden=true;}; // Transition is selected in the existing action form; screen fields appear in a separate modal. var transitionSelect=modal.querySelector('#mmNextTransition'); var cards=document.createElement('div');cards.className='mm-transition-tiles'; cards.innerHTML=(data.transitions||[]).map(function(t){return '<button type="button" class="mm-transition-tile" data-transition-id="'+esc(t.id)+'">'+esc(t.name)+'</button>';}).join(''); transitionSelect.parentNode.appendChild(cards);transitionSelect.style.display='none'; var screenMeta=null,screenLoadToken=0,confirmedTransition=null; cards.querySelectorAll('[data-transition-id]').forEach(function(tile){tile.onclick=function(){ var tid=tile.dataset.transitionId;transitionSelect.value=tid;confirmedTransition=null; cards.querySelectorAll('[data-transition-id]').forEach(function(x){x.classList.toggle('chosen',x===tile);}); var token=++screenLoadToken;status('در حال دریافت فیلدهای مرحله...'); mmTransitionMeta(r.key).then(function(meta){ if(!modal.isConnected||token!==screenLoadToken)return; screenMeta=meta;status(''); var host=modal.querySelector('#mqV49InlineStageFields'); if(!host)return; mmOpenTransitionDialog(modal,meta,tid,r.key,function(values,comment){ confirmedTransition={id:String(tid),fields:values,comment:comment}; status('اطلاعات مرحله تأیید شد. برای اعمال وضعیت، «ثبت اقدام» را بزنید.'); },host); }).catch(function(e){if(token===screenLoadToken){status('دریافت فیلدهای مرحله ناموفق بود: '+vError(e));transitionSelect.value='';tile.classList.remove('chosen');}}); };}); // MEDIQ V47.0 – presentation only; keep original identifiers and explicit save behavior. var infoSection=modal.querySelector('.mm-request-body > .mm-form-section'); var infoGrid=infoSection.querySelector('.mm-request-grid'); var priorityLabel=modal.querySelector('#mmEditPriority').closest('label'); var priorityInput=modal.querySelector('#mmEditPriority'); priorityInput.style.display='none'; var importance=String(r.priority||'نامشخص'); var MQ_V494_ICONS=MQ_MEDIQ_PRIORITY_ASSETS; var mqImportanceLevel=mqPriorityAsset(importance); var mqImportanceIcons=MQ_V494_ICONS; priorityLabel.firstChild.textContent='اهمیت : '; priorityLabel.insertAdjacentHTML('beforeend','<span class="mq-v47-priority" aria-label="اهمیت '+esc(importance)+'" title="'+esc(importance)+'"><img class="mq-v494-icon" src="'+mqImportanceIcons[mqImportanceLevel]+'" alt="'+esc(importance)+'"><span class="mq-v494-importance-text">'+esc(importance)+'</span></span>'); var assetBox=modal.querySelector('.mm-related-asset'); if(assetBox){ assetBox.classList.add('mq-v47-device');infoGrid.appendChild(assetBox); var imageSource=String(asset.imageUrl||asset.avatarUrl||asset.thumbnailUrl||''); if(imageSource && (/^\/[^/]/.test(imageSource)||/^https:\/\/[^\s]+$/i.test(imageSource))){ var image=document.createElement('img');image.className='mq-v47-product-image';image.alt='تصویر دستگاه';image.loading='lazy';image.src=imageSource;assetBox.insertBefore(image,assetBox.firstChild.nextSibling); } } var currentStatus=document.createElement('div');currentStatus.className='mq-v47-status';currentStatus.innerHTML='<span>وضعیت فعلی :</span><strong>'+esc(r.status||'نامشخص')+'</strong>'; infoGrid.appendChild(currentStatus); var actionSection=document.createElement('div');actionSection.className='mm-form-section mq-v47-action'; actionSection.innerHTML='<h4>اقدام</h4><p class="mq-v47-help">مرحله بعد را انتخاب کنید؛ تغییر فقط پس از ثبت اقدام اعمال میشود.</p>'; var actionBox=document.createElement('div');actionBox.className='mq-v47-actions-container';actionSection.appendChild(actionBox); var workflow=document.createElement('div');workflow.className='mq-v497-flow mm-workflow'; var workflowStages=[['new','ثبت و شروع'],['work','در حال انجام'],['repair','تعمیر و پیگیری'],['handover','آماده تحویل / تحویل'],['close','بستن و محاسبه']]; var currentStage=mmMaintenanceStage(r.status||''); var currentStageIndex=workflowStages.findIndex(function(step){return step[0]===currentStage;}); workflow.innerHTML='<h4>روند فعالیت</h4><div class="mm-stage-grid">'+workflowStages.map(function(step,index){ var state=index===currentStageIndex?' current':index<currentStageIndex?' done':''; return '<span class="mm-stage'+state+'"'+(index===currentStageIndex?' aria-current="step"':'')+'>'+step[1]+'</span>'; }).join('')+'</div>'; actionBox.appendChild(workflow); var transitionLabel=transitionSelect.closest('label'); var actionRow=document.createElement('div');actionRow.className='mq-v494-action-row';actionBox.appendChild(actionRow); if(transitionLabel){transitionLabel.classList.add('mq-v49-stage-label');transitionLabel.firstChild.textContent='تغییر وضعیت';actionRow.appendChild(transitionLabel);} var inlineFields=document.createElement('div');inlineFields.id='mqV49InlineStageFields';inlineFields.className='mq-v49-inline-stage-host';actionBox.appendChild(inlineFields); var assigneeLabel=modal.querySelector('#mmEditAssignee').closest('label');if(assigneeLabel)actionRow.appendChild(assigneeLabel); var selfAssign=document.createElement('button');selfAssign.type='button';selfAssign.className='mq-v47-self';selfAssign.textContent='ارجاع به خودم'; selfAssign.onclick=function(){ var btn=this;btn.disabled=true; mmApi('issue.me').then(function(me){ if(!me||me.ok===false||!me.name)throw Error('حساب کاربر فعلی شناسایی نشد.'); assigneeId.value=me.name; assignee.value=me.displayName||me.name; var menu=assignee.parentNode.querySelector('.mm-user-menu');if(menu)menu.innerHTML=''; status('مسئول انتخاب شد. برای اعمال ارجاع، دکمه «ثبت اقدام» را بزنید.'); }).catch(function(e){status('ارجاع به خودم: '+vError(e));}).finally(function(){btn.disabled=false;}); }; if(assigneeLabel)assigneeLabel.appendChild(selfAssign); var actionButtons=infoSection.querySelector('.mm-actions');if(actionButtons)actionSection.appendChild(actionButtons); var actionResult=infoSection.querySelector('#mmSaveIssueResult');if(actionResult)actionSection.appendChild(actionResult); infoSection.insertAdjacentElement('afterend',actionSection); var noteSection=modal.querySelector('#mmCommentList')?.closest('.mm-form-section'); if(noteSection){noteSection.classList.add('mq-v47-notes');var noteButtons=noteSection.querySelector('.mm-comment-actions');if(noteButtons)noteButtons.insertAdjacentHTML('afterend','<h5>سوابق یادداشت</h5>');} modal.querySelector('#mmEditAssignee').closest('label').firstChild.textContent='ارجاع به'; var assignee=modal.querySelector('#mmEditAssignee'),assigneeId=modal.querySelector('#mmEditAssigneeId');mmIssueUserPicker(assignee,assigneeId);assignee.value=mmCleanFullName(r.assignee||''); function status(t){modal.querySelector('#mmSaveIssueResult').textContent=t;} modal.querySelector('#mmSaveIssue').onclick=function(){ var summary=modal.querySelector('#mmEditSummary').value.trim(); var description=modal.querySelector('#mmEditDescription').value; var transitionId=modal.querySelector('#mmNextTransition').value; var transitionFields={};if(transitionId){if(!confirmedTransition||confirmedTransition.id!==String(transitionId)){status('ابتدا مرحله موردنظر را انتخاب و فرم آن را تأیید کنید.');return;}transitionFields=confirmedTransition.fields;} var b=this; b.disabled=true; status('در حال ذخیره تغییرات...'); var changed=summary!==(r.summary||'')||description!==(r.description||'')||assigneeId.value!==(r.assigneeKey||''); (changed?mmWrite('issue.update',{ key:r.key,summary:summary,description:description, assignee:assigneeId.value, priorityId:originalFields.priority }):Promise.resolve({ok:true})).then(function(updateResponse){ if(updateResponse && updateResponse.ok === false){ throw new Error(updateResponse.message || 'ثبت تغییرات تأیید نشد.'); } if(!transitionId)return false; status('تغییرات ذخیره شد؛ در حال تغییر وضعیت...'); return mmTransitionExecute(r.key,transitionId,transitionFields,confirmedTransition.comment).then(function(transitionResponse){ if(transitionResponse && transitionResponse.ok === false){ throw new Error(transitionResponse.message || 'تغییر وضعیت تأیید نشد.'); } return true; }); }).then(function(changedStatus){ // Close the existing dialog ONLY after Jira has accepted all requested writes. if(modal.isConnected)modal.remove(); // Refresh the selected activity panel without reopening the action modal. var panel=document.getElementById('mmPermanentIssue'); if(panel && panel.isConnected && !panel.hidden){ mmIssueDetail(r.key).then(function(d){ if(panel.isConnected && !panel.hidden)mmRenderPermanentIssue(panel,d); }).catch(function(e){ console.warn('MediQ: activity detail refresh failed after successful save',e); }); } // Refresh KPI counts and the activity list; a refresh error must not undo success. mmApi('overview').then(function(x){ MM.activities=x.activities||[]; if(MM.tab==='overview'){ // Preserve the existing dashboard renderer and current filters. mmPaintActivities(); } }).catch(function(e){ console.warn('MediQ: dashboard refresh failed after successful save',e); }); }).catch(function(e){ if(modal.isConnected)status('ذخیره یا انتقال وضعیت کامل نشد: '+vError(e)); }).finally(function(){b.disabled=false;}); }; modal.querySelector('#mmSendComment').onclick=function(){var message=modal.querySelector('#mmNewComment').value.trim();if(!message){modal.querySelector('#mmCommentResult').textContent='متن پیام را وارد کنید.';return;}var b=this;b.disabled=true;mmWrite('issue.comment',{key:r.key,body:message,visibility:modal.querySelector('#mmCommentVisibility').value}).then(function(){modal.querySelector('#mmCommentResult').textContent='پیام ثبت شد.';modal.querySelector('#mmNewComment').value='';}).catch(function(e){modal.querySelector('#mmCommentResult').textContent=vError(e);}).finally(function(){b.disabled=false;});}; modal.querySelector('#mmSendCommentInternal').onclick=function(){modal.querySelector('#mmCommentVisibility').value='internal';modal.querySelector('#mmSendComment').click();}; modal.querySelector('#mmSendComment').addEventListener('click',function(e){if(e.isTrusted)modal.querySelector('#mmCommentVisibility').value='public';},true); modal.querySelector('#mmAssetButton').onclick=function(){var host=modal.querySelector('#mmAssetTickets');if(!asset.key)return;host.hidden=false;host.textContent='در حال بررسی درخواستهای مرتبط...';mmApi('asset.tickets',{type:asset.key}).then(function(x){var items=x.items||[];host.innerHTML='<h4>درخواستهای مرتبط با '+esc(asset.label||asset.key)+'</h4>'+(items.length?items.map(function(it){return '<button type="button" class="mm-related-ticket" data-related="'+esc(it.key)+'">'+esc(it.key)+' — '+esc(it.summary)+'</button>';}).join(''):'درخواستی با شناسه این دارایی پیدا نشد.');host.querySelectorAll('[data-related]').forEach(function(b){b.onclick=function(){mmIssueDetail(b.dataset.related).then(mmOpenIssueModal);};});}).catch(function(e){host.textContent=vError(e);});}; } function mmReceiptCalendar(){ var input=document.getElementById('mmReceiptDate'),host=document.getElementById('mmReceiptDate_cal');if(!input||!host)return; if(!host.hidden){host.hidden=true;return;} var parts=String(input.value).replace(/[۰-۹]/g,function(c){return '۰۱۲۳۴۵۶۷۸۹'.indexOf(c);}).match(/(\d{4})\/(\d{1,2})\/(\d{1,2})/); var now=new Intl.DateTimeFormat('en-US-u-ca-persian',{year:'numeric',month:'numeric',day:'numeric',timeZone:'Asia/Tehran'}).formatToParts(new Date()),today={};now.forEach(function(v){if(['year','month'].includes(v.type))today[v.type]=+v.value;}); var y=parts?+parts[1]:today.year,m=parts?+parts[2]:today.month; var months=['فروردین','اردیبهشت','خرداد','تیر','مرداد','شهریور','مهر','آبان','آذر','دی','بهمن','اسفند']; function render(){var len=m<7?31:m<12?30:29;if(m===12){try{mmIsoDate(y+'/12/30');len=30;}catch(e){}} var first=new Date(mmIsoDate(y+'/'+m+'/1')+'T12:00:00Z').getUTCDay(),offset=(first+1)%7; host.innerHTML='<div class="mm-cal-head"><button type="button" data-step="-1">قبل</button><strong>'+months[m-1]+' '+y+'</strong><button type="button" data-step="1">بعد</button></div><div class="mm-cal-days">'+['ش','ی','د','س','چ','پ','ج'].map(function(a){return '<b>'+a+'</b>';}).join('')+'<i></i>'.repeat(offset)+Array.from({length:len},function(_,i){return '<button type="button" data-day="'+(i+1)+'">'+(i+1).toLocaleString('fa-IR')+'</button>';}).join('')+'</div>'; host.querySelectorAll('[data-step]').forEach(function(b){b.onclick=function(){m+=+b.dataset.step;if(m===0){m=12;y--;}if(m===13){m=1;y++;}render();};});host.querySelectorAll('[data-day]').forEach(function(b){b.onclick=function(){input.value=(y+'/'+String(m).padStart(2,'0')+'/'+String(+b.dataset.day).padStart(2,'0')).replace(/\d/g,function(d){return '۰۱۲۳۴۵۶۷۸۹'[+d];});host.hidden=true;};});} host.hidden=false;render(); } function mmEquipTable(rows,docs){return mmTable(['شناسه','دستگاه','اسناد تعمیراتی'],rows.slice(0,500).map(function(r){var d=docs.filter(function(x){return x.equipment===r.key;});return [esc(r.key),esc(labelOf(r)),d.length?d.map(function(x){return mmLink(x.url)+' ('+esc(x.title)+')';}).join(' | '):'سندی ثبت نشده'];}));} function mmScope(){var s=$id('mm_scope'),t=$id('mm_target');if(!s||!t)return;var load=function(){t.innerHTML='<option value="">در حال بارگذاری...</option>';mmApi('scope',{type:s.value}).then(function(x){if(!t.isConnected)return;t.innerHTML='<option value="">انتخاب کنید</option>'+x.items.map(function(o){return '<option value="'+esc(o.key)+'">'+esc(o.label)+'</option>';}).join('');}).catch(function(e){t.innerHTML='<option value="">'+esc(vError(e))+'</option>';});};s.onchange=load;load();var search=$id('mm_targetSearch');if(search){search.oninput=function(){var q=searchNorm(search.value);Array.from(t.options).forEach(function(o){o.hidden=!!q&&searchNorm(o.textContent).indexOf(q)<0;});};}t.onchange=function(){var key=t.value, text=t.options[t.selectedIndex]?t.options[t.selectedIndex].textContent:'';var table=document.querySelector('#mmContent .mq-tbl-wrap table');if(!table)return;Array.from(table.querySelectorAll('tbody tr')).forEach(function(tr){var hay=searchNorm(tr.textContent);tr.hidden=!!key&&hay.indexOf(searchNorm(key))<0&&hay.indexOf(searchNorm(text))<0;});};} function mmBindTargetCombo(){ var input=$id('mm_targetQuery'),menu=$id('mm_targetOptions'),select=$id('mm_target');if(!input||!menu||!select)return; function fill(){var term=searchNorm(input.value||'');var options=Array.from(select.options).filter(function(o){return o.value&&(!term||searchNorm(o.textContent).includes(term));}).slice(0,70);menu.innerHTML=options.length?options.map(function(o){return '<button type="button" data-target-key="'+esc(o.value)+'">'+esc(o.textContent)+'</button>';}).join(''):'<span class="mm-combo-empty">موردی یافت نشد</span>';menu.hidden=false;input.setAttribute('aria-expanded','true');} input.addEventListener('focus',fill);input.addEventListener('input',function(){select.value='';fill();}); menu.addEventListener('click',function(e){var button=e.target.closest('[data-target-key]');if(!button)return;select.value=button.dataset.targetKey;input.value=select.options[select.selectedIndex].textContent;menu.hidden=true;input.setAttribute('aria-expanded','false');select.dispatchEvent(new Event('change',{bubbles:true}));}); document.addEventListener('click',function(e){if(!input.isConnected)return;if(!e.target.closest('.mm-combo')){menu.hidden=true;input.setAttribute('aria-expanded','false');}},true); var scope=$id('mm_scope');if(scope)scope.addEventListener('change',function(){input.value='';menu.hidden=true;}); } function mmAttachSearchSelect(id,filterCallback){ var select=$id(id);if(!select||select.dataset.comboReady)return;select.dataset.comboReady='1'; var parent=select.parentNode;var wrapper=document.createElement('div');wrapper.className='mm-combo mm-combo-device';parent.insertBefore(wrapper,select); var inp=document.createElement('input');inp.type='search';inp.autocomplete='off';inp.placeholder='برای جستوجو نام یا شناسه را تایپ کنید';inp.setAttribute('aria-label','جستوجو و انتخاب'); var menu=document.createElement('div');menu.className='mm-combo-menu';menu.hidden=true;wrapper.appendChild(inp);wrapper.appendChild(menu);wrapper.appendChild(select);select.style.display='none'; var opts=Array.from(select.options).filter(function(x){return x.value;}).map(function(x){return {value:x.value,text:x.textContent};}); function paint(){var q=searchNorm(inp.value);var list=opts.filter(function(x){return !q||searchNorm(x.text).indexOf(q)>=0;}).slice(0,80);menu.innerHTML=list.length?list.map(function(x){return '<button type="button" data-combo-val="'+esc(x.value)+'">'+esc(x.text)+'</button>';}).join(''):'<span class="mm-combo-empty">موردی یافت نشد</span>';menu.hidden=false;} inp.addEventListener('focus',paint);inp.addEventListener('input',function(){select.value='';paint();if(filterCallback)filterCallback('','');}); menu.addEventListener('click',function(e){var option=e.target.closest('[data-combo-val]');if(!option)return;select.value=option.getAttribute('data-combo-val');var entry=opts.find(function(x){return x.value===select.value;});inp.value=entry?entry.text:'';menu.hidden=true;select.dispatchEvent(new Event('change',{bubbles:true}));if(filterCallback)filterCallback(select.value,inp.value);}); document.addEventListener('click',function(e){if(inp.isConnected&&!wrapper.contains(e.target))menu.hidden=true;},true); } function mmBind(){ document.querySelectorAll('#mmContent [data-mm-kpi]').forEach(function(btn){btn.onclick=function(){MM.cardFilter=btn.getAttribute('data-mm-kpi');document.querySelectorAll('#mmContent [data-mm-kpi]').forEach(function(x){var selected=x===btn;x.classList.toggle('active',selected);x.setAttribute('aria-pressed',selected?'true':'false');});var t=$id('mmType'),st=$id('mmStatus');if(t)t.value='all';if(st)st.value='all';mmPaintActivities();};}); if(MM.tab==='plans'){var form=document.querySelector('#mmContent .mm-plan-form'),table=document.querySelector('#mmContent .mq-tbl-wrap');if(form&&table&&table.parentElement){var formHeading=$id('mmPlanFormHeading'),listHeading=$id('mmPlanListHeading');if(formHeading)table.parentElement.insertBefore(formHeading,table);table.parentElement.insertBefore(form,table);if(listHeading)table.parentElement.insertBefore(listHeading,table);}} document.querySelectorAll('[data-mm-side]').forEach(function(btn){btn.onclick=function(){mmLoad(btn.getAttribute('data-mm-side'));};}); if(MM.tab==='em')mmAttachSearchSelect('mm_device'); if(MM.tab==='equipment')mmAttachSearchSelect('mm_equipment',function(key,label){var search=$id('mmEquipSearch');if(search){search.value=key||label||'';search.dispatchEvent(new Event('input',{bubbles:true}));}}); if(MM.tab==='evaluations'){mmAttachSearchSelect('mm_issue');mmAttachSearchSelect('mm_supplier');} if(MM.tab==='contracts')mmAttachSearchSelect('mm_supplier'); document.querySelectorAll('#mmContent .mm-date-line input').forEach(function(input){input.onclick=function(e){e.stopPropagation();mmCalendar(input.id);};input.onkeydown=function(e){if(e.key==='Enter'||e.key===' '){e.preventDefault();mmCalendar(input.id);}};});var b=$id('mmSubmit');if(b){var map={plans:['pm.create',['kind','scope','target','start','end','period','active','contract']],em:['em.create',['device','priority','downtime','description']],suppliers:['supplier.create',['name','phone','address','contact','contactPhone','category']],evaluations:['evaluation.save',['issue','supplier','score','note']],contracts:['contract.save',['title','contractType','number','supplier','start','end','coverage']],equipment:['document.save',['equipment','title','docType','issue']]};var f=map[MM.tab];if(f)b.onclick=function(){if(f[0]==='pm.create'&&!mmDateNotPast())return;mmSave(f[0],f[1]);};} document.querySelectorAll('[data-mm-plan-edit]').forEach(function(btn){btn.onclick=function(){var plan=(MM.plans||[]).find(function(p){return p.key===btn.dataset.mmPlanEdit;});if(!plan)return;var form=$id('mmPlanFormHeading');if(form)form.scrollIntoView({block:'start',behavior:'smooth'});var kind=$id('mm_kind'),scope=$id('mm_scope'),period=$id('mm_period'),status=$id('mm_active'),start=$id('mm_start'),end=$id('mm_end'),identity=$id('mmEditIdentity');document.querySelectorAll('#mmContent .mq-tbl tbody tr').forEach(function(tr){tr.classList.toggle('mm-plan-row-selected',!!tr.querySelector('button[data-mm-plan-edit=\"'+plan.key+'\"]'));});if(form)form.textContent='ویرایش برنامه '+plan.key;if(kind)kind.value=plan.kind||'PM';if(period){period.value='';var requested=String(plan.period==null?'':plan.period);if(Array.from(period.options).some(function(o){return o.value===requested;}))period.value=requested;else period.selectedIndex=0;}if(status)status.value=mmPlanState(plan)==='غیرفعال'?'inactive':'active';if(start)start.value=mmFaDate(plan.start||plan.next||'').replace(/\u200e/g,'');if(end)end.value=plan.end?mmFaDate(plan.end).replace(/\u200e/g,''):'';var contractSelect=$id('mm_contract');if(contractSelect){contractSelect.value=plan.contract||'';}if(scope)scope.value=plan.scope||scope.value;var submit=$id('mmSubmit');if(submit){submit.textContent='ذخیره ویرایش';submit.onclick=function(){var obj={key:plan.key,kind:mmVal('mm_kind'),scope:mmVal('mm_scope'),target:mmVal('mm_target'),period:mmVal('mm_period'),active:mmVal('mm_active'),end:mmVal('mm_end'),contract:mmVal('mm_contract')};try{obj.start=mmIsoDate(mmVal('mm_start'));if(obj.end)obj.end=mmIsoDate(obj.end);if(obj.end&&obj.end<obj.start)throw new Error('تاریخ پایان نمیتواند قبل از تاریخ شروع باشد.');if(!obj.period&&obj.kind==='PM')throw new Error('دوره این برنامه نامشخص است؛ دوره جدید را انتخاب کنید.');}catch(e){$id('mmNotice').textContent=e.message;return;}submit.disabled=true;mmWrite('pm.update',obj).then(function(){mmLoad('plans');}).catch(function(e){$id('mmNotice').textContent='ویرایش ثبت نشد: '+vError(e);}).finally(function(){submit.disabled=false;});};}};}); document.querySelectorAll('[data-mm-plan-toggle]').forEach(function(btn){btn.onclick=function(){var key=btn.getAttribute('data-mm-plan-toggle'),next=btn.getAttribute('data-mm-plan-state');btn.disabled=true;mmWrite('pm.toggle',{key:key,state:next}).then(function(){mmLoad('plans');}).catch(function(err){btn.disabled=false;window.alert('تغییر وضعیت ثبت نشد: '+vError(err));});};}); ['mmSearch','mmType','mmStatus','mmOrder','mmPriority'].forEach(function(id){var x=$id(id);if(x){x.oninput=mmPaintActivities;x.onchange=mmPaintActivities;}});var nameInput=$id('mm_name');if(nameInput)nameInput.oninput=function(){var search=$id('mmSupplierSearch');if(search){search.value=nameInput.value;search.dispatchEvent(new Event('input',{bubbles:true}));}};var sq=$id('mmSupplierSearch'),sg=$id('mmSupplierGroupFilter');var filterSuppliers=function(){var dest=$id('mmSupplierRows'),q=(sq?sq.value:'').toLowerCase(),group=sg?sg.value:'';if(dest)dest.innerHTML=mmTable(['نام','گروه تأمینکننده','تلفن','رابط','تلفن رابط'],MM.suppliers.filter(function(s){return (!group||String(s.category||'')===group)&&(s.name+' '+s.phone+' '+s.contact+' '+s.category).toLowerCase().includes(q);}).map(function(s){return [esc(s.name),esc(s.category),esc(s.phone),esc(s.contact),esc(s.contactPhone)];}));};if(sq)sq.oninput=filterSuppliers;if(sg)sg.onchange=filterSuppliers;var formGroup=$id('mm_category');if(formGroup)formGroup.addEventListener('change',function(){if(sg){sg.value=formGroup.value;filterSuppliers();}});var e=$id('mmEquipSearch');if(e)e.oninput=function(){$id('mmEquipRows').innerHTML=mmEquipTable(MM.equipment.filter(function(r){return (r.key+' '+labelOf(r)).toLowerCase().indexOf(e.value.toLowerCase())>=0;}),MM.documents||[]);};} document.addEventListener('click',function(e){if(!e.target.closest('#mmContent .mm-date-line,#mmContent .mm-cal'))document.querySelectorAll('#mmContent .mm-cal').forEach(function(c){c.hidden=true;});},true); /* V31: internal navigation history. Capture real entry routes, not hard-coded previous screens. */ var MQ_V31_HISTORY=[]; var MQ_V31_CURRENT=null; var MQ_V31_REPLAY=false; var MQ_V31_NESTING=0; function mqV31Route(key,args){return {key:key,args:Array.prototype.slice.call(args||[])};} function mqV31Equal(a,b){return !!a&&!!b&&a.key===b.key&&JSON.stringify(a.args)===JSON.stringify(b.args);} function mqV31Track(key,fn){ return function(){ var next=mqV31Route(key,arguments),top=MQ_V31_NESTING===0; if(top&&!MQ_V31_REPLAY&&!mqV31Equal(MQ_V31_CURRENT,next)){ if(MQ_V31_CURRENT)MQ_V31_HISTORY.push(MQ_V31_CURRENT); MQ_V31_CURRENT=next; } MQ_V31_NESTING++; try { return fn.apply(this,arguments); } finally { MQ_V31_NESTING--;mqV31BackVisibility(); } }; } function mqV31BackVisibility(){ if(backButton)backButton.style.display=MQ_V31_HISTORY.length?'inline-block':'none'; } var MQ_V31_RENDERERS={ equipment:renderEquipment, logistics:renderLogistics, property:renderAssetSections, simple:renderSimplePage, generic:mqTreeSimpleEquipmentPage, analysis:vAnalysis, suppliers:vSupplierScreen, cycle:renderOtherCycle, maintenance:renderMediqMaintenance }; renderEquipment=mqV31Track('equipment',MQ_V31_RENDERERS.equipment); renderLogistics=mqV31Track('logistics',MQ_V31_RENDERERS.logistics); renderAssetSections=mqV31Track('property',MQ_V31_RENDERERS.property); renderSimplePage=mqV31Track('simple',MQ_V31_RENDERERS.simple); mqTreeSimpleEquipmentPage=mqV31Track('generic',MQ_V31_RENDERERS.generic); vAnalysis=mqV31Track('analysis',MQ_V31_RENDERERS.analysis); vSupplierScreen=mqV31Track('suppliers',MQ_V31_RENDERERS.suppliers); renderOtherCycle=mqV31Track('cycle',MQ_V31_RENDERERS.cycle); renderMediqMaintenance=mqV31Track('maintenance',MQ_V31_RENDERERS.maintenance); backButton.onclick=function(){ if(!MQ_V31_HISTORY.length)return; var prev=MQ_V31_HISTORY.pop(),renderer=MQ_V31_RENDERERS[prev.key]; if(!renderer)return; MQ_V31_REPLAY=true; try { MQ_V31_CURRENT=prev;renderer.apply(null,prev.args); } finally { MQ_V31_REPLAY=false;mqV31BackVisibility(); } }; /* ============================================================ INITIAL ============================================================ */ function mqBoot(){ try { bindTree(); document.querySelectorAll('#mqTree [data-v32-nav]').forEach(function(el){el.onclick=function(){ var k=this.getAttribute('data-v32-nav'); if(k==='suppliers')vSupplierScreen(); else if(k==='fixed'||k==='assets')renderAssetSections('newAsset'); else if(k==='handover'){mqV48Handover();} else if(k==='consumable')renderSimplePage('کالاهای مصرفی'); mqTreeActivate(k==='assets'?'propertyAssets':k==='handover'?'propertyHandover':k); };}); renderEquipment(); } catch (initErr) { mqShowFatal(initErr && initErr.message ? initErr.message : String(initErr)); if (window.console && console.error) console.error("MEDIQ INIT ERROR", initErr); } } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", mqBoot, { once: true }); } else { mqBoot(); } })(); /* V49.28 — internal issue viewer, no direct Jira navigation for view-request links */ document.addEventListener('click',function(ev){ var target=ev.target.closest('[data-mq-internal-issue],a[href*="support.h-soft.ir/browse/"]'); if(!target||!document.getElementById('mediq-dashboard')?.contains(target))return; var key=target.getAttribute('data-mq-internal-issue')||((target.getAttribute('href')||'').match(/\bMED-\d+\b/)||[])[0]; if(!/^MED-\d+$/.test(key))return; // Intercept explicit request-view links only; other intentional cross-system links remain unchanged. if(!target.hasAttribute('data-mq-internal-issue')&&!/مشاهده|درخواست|جزئیات/.test(target.textContent||''))return; ev.preventDefault();ev.stopImmediatePropagation(); mmIssueDetail(key).then(mmOpenIssueModal).catch(function(err){showToast('نمایش جزئیات درخواست در مدیکیو ممکن نشد: '+vError(err));}); },true); </script> </div> <style> /* MediQ V40: stable dashboard and repaired fixed activity inspector */ #mediq-dashboard #mmContent .v-stats{display:grid!important;grid-template-columns:repeat(5,minmax(0,1fr))!important;gap:14px!important;direction:rtl!important;grid-auto-flow:row!important;width:100%!important;clear:both!important} #mediq-dashboard #mmContent .v-stats>.mm-kpi-card{width:100%!important;min-width:0!important;float:none!important;direction:rtl!important;text-align:right!important;display:flex!important;flex-direction:column!important;align-items:stretch!important;justify-content:center!important;min-height:126px!important;gap:9px!important;padding:19px!important} #mediq-dashboard #mmContent .v-stats>.mm-kpi-card:nth-child(1){border-top:4px solid #218ccb!important}#mediq-dashboard #mmContent .v-stats>.mm-kpi-card:nth-child(2){border-top:4px solid #21a77a!important}#mediq-dashboard #mmContent .v-stats>.mm-kpi-card:nth-child(3){border-top:4px solid #ec9e3b!important}#mediq-dashboard #mmContent .v-stats>.mm-kpi-card:nth-child(4){border-top:4px solid #5da3cd!important}#mediq-dashboard #mmContent .v-stats>.mm-kpi-card:nth-child(5){border-top:4px solid #d66b6b!important} #mediq-dashboard #mmContent .v-stats>.mm-kpi-card::before{content:'▦';position:absolute;left:16px;top:14px;font-size:24px;color:#258dc4;background:#e8f5fc;width:40px;height:40px;display:grid;place-items:center;border-radius:11px}#mediq-dashboard #mmContent .v-stats>.mm-kpi-card:nth-child(2)::before{content:'✓';color:#158e6d;background:#e7f8f1}#mediq-dashboard #mmContent .v-stats>.mm-kpi-card:nth-child(3)::before{content:'⚒';color:#bc7c25;background:#fff6e9}#mediq-dashboard #mmContent .v-stats>.mm-kpi-card:nth-child(4)::before{content:'✔'}#mediq-dashboard #mmContent .v-stats>.mm-kpi-card:nth-child(5)::before{content:'!';color:#b85252;background:#fff0f0} #mediq-dashboard #mmContent.mm-with-fixed-side{display:grid!important;grid-template-columns:minmax(350px,36%) minmax(0,1fr)!important;grid-template-rows:auto auto auto minmax(0,1fr)!important;column-gap:16px!important;row-gap:10px!important;direction:ltr!important;align-items:start!important} #mediq-dashboard #mmContent.mm-with-fixed-side>.v-stats{grid-column:1/-1!important;grid-row:1!important;direction:rtl!important} #mediq-dashboard #mmContent.mm-with-fixed-side>#mmActivitiesHeading{grid-column:1/-1!important;grid-row:2!important;direction:rtl!important;margin:4px 0!important} #mediq-dashboard #mmContent.mm-with-fixed-side>#mmPermanentIssue{grid-column:1!important;grid-row:3 / span 2!important;position:sticky!important;top:14px!important;float:none!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;max-height:calc(100vh - 52px)!important;overflow-x:hidden!important;overflow-y:auto!important;margin:0!important;padding:13px!important;direction:rtl!important;display:block!important} #mediq-dashboard #mmContent.mm-with-fixed-side>.mm-actionbar{grid-column:2!important;grid-row:3!important;margin:0!important;width:100%!important;min-width:0!important;direction:rtl!important} #mediq-dashboard #mmContent.mm-with-fixed-side>#mmRows{grid-column:2!important;grid-row:4!important;margin:0!important;width:100%!important;min-width:0!important;direction:rtl!important;overflow:auto!important} #mediq-dashboard #mmPermanentIssue .mm-detail-card:first-of-type .mm-accordion-body{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;column-gap:15px!important} #mediq-dashboard #mmPermanentIssue .mm-detail-line{display:flex!important;flex-direction:row!important;flex-wrap:wrap!important;gap:4px 10px!important;white-space:normal!important;word-break:normal!important;overflow-wrap:anywhere!important;width:100%!important;min-width:0!important;line-height:1.8!important} #mediq-dashboard #mmPermanentIssue .mm-detail-line span{flex:0 1 auto!important;min-width:48px!important;max-width:100%!important} #mediq-dashboard #mmPermanentIssue .mm-detail-line strong{flex:1 1 95px!important;text-align:right!important;min-width:0!important;word-break:break-word!important;overflow-wrap:anywhere!important} #mediq-dashboard #mmPermanentIssue .mm-accordion-toggle{width:100%!important;min-width:0!important;direction:rtl!important} #mediq-dashboard #mmPermanentIssue .mm-accordion-body{min-width:0!important;max-width:100%!important} #mediq-dashboard .mm-panel-empty{min-height:210px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;text-align:center;color:#527c98;background:#f4faff;border:1px dashed #c2dfef;border-radius:13px;padding:20px;font-size:13px}.mm-panel-empty-icon{font-size:28px;color:#268bbd} #mediq-dashboard #mmContent .mm-permanent-panel[hidden]{display:block!important} .mm-discard-overlay{position:absolute!important;inset:0!important;z-index:999!important;display:grid!important;place-items:center!important;background:rgba(21,53,78,.48)!important;backdrop-filter:blur(2px)}.mm-discard-overlay[hidden]{display:none!important}.mm-discard-card{width:min(90%,470px)!important;max-width:470px!important;box-sizing:border-box!important;padding:28px!important;border:1px solid #cbe3f2!important;border-radius:18px!important;background:#fff!important;box-shadow:0 22px 70px #193e5a40!important}.mm-discard-card strong{display:block;color:#11628e!important;font-size:18px!important;margin-bottom:11px}.mm-discard-card p{font-size:14px;line-height:2;color:#456c85}.mm-discard-card>div{gap:12px!important;margin-top:17px} .mm-comment-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:10px}.mm-comment-actions button{background:#15976d!important;border-color:#15976d!important;color:white!important;border-radius:9px!important;padding:10px 17px!important;font-weight:800!important} .mm-compact-attachments{padding:13px!important}.mm-compact-attachments .mm-documents{max-height:90px;overflow:auto}.mm-attach-trigger{display:inline-flex;align-items:center;gap:12px;max-width:100%;background:#f2fafc;border:1px solid #c9e3ee;border-radius:9px;padding:7px 12px}.mm-attach-trigger input{max-width:230px!important} #mediq-dashboard #mmTreeChildren [data-mm-tree='contracts']{display:none!important} @media(max-width:1000px){#mediq-dashboard #mmContent .v-stats{grid-template-columns:repeat(2,minmax(0,1fr))!important}#mediq-dashboard #mmContent.mm-with-fixed-side{grid-template-columns:minmax(0,1fr)!important}#mediq-dashboard #mmContent.mm-with-fixed-side>#mmPermanentIssue{grid-column:1!important;grid-row:3!important;position:relative!important;max-height:440px!important}#mediq-dashboard #mmContent.mm-with-fixed-side>.mm-actionbar{grid-column:1!important;grid-row:4!important}#mediq-dashboard #mmContent.mm-with-fixed-side>#mmRows{grid-column:1!important;grid-row:5!important}} @media(max-width:600px){#mediq-dashboard #mmContent .v-stats{grid-template-columns:1fr!important}} /* MediQ V41 panel and print presentation refinements */ #mediq-dashboard #mmContent.mm-with-fixed-side{grid-template-rows:auto auto auto minmax(0,1fr)!important} #mediq-dashboard #mmPermanentIssue .mm-always-open .mm-accordion-toggle{background:transparent!important;border:0!important;pointer-events:none!important;color:#11608c!important;font-size:15px!important;font-weight:900!important;padding:12px 5px!important;text-align:right!important} #mediq-dashboard #mmPermanentIssue .mm-always-open .mm-accordion-chevron{display:none!important} #mediq-dashboard #mmPermanentIssue .mm-always-open .mm-accordion-body{display:block!important;visibility:visible!important} #mediq-dashboard #mmPermanentIssue .mm-detail-card:first-of-type .mm-accordion-body{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:8px 12px!important} #mediq-dashboard #mmPermanentIssue .mm-detail-line{display:flex!important;flex-direction:column!important;gap:3px!important;padding:10px!important;border:1px solid #e1edf4!important;border-radius:9px!important;align-items:flex-start!important} #mediq-dashboard #mmPermanentIssue .mm-detail-line span,#mediq-dashboard #mmPermanentIssue .mm-detail-line strong{flex:none!important;width:100%!important;text-align:right!important;overflow-wrap:anywhere!important} #mediq-dashboard #mmPermanentIssue .mm-detail-line strong{font-size:13px!important;font-weight:800!important} #mediq-dashboard #mmPermanentIssue .mm-handover-grid{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:12px!important;direction:rtl!important} #mediq-dashboard #mmPermanentIssue .mm-handover-grid label{min-width:0!important;text-align:right!important} #mediq-dashboard #mmPermanentIssue .mm-handover-grid input{width:100%!important;min-width:0!important;box-sizing:border-box!important} #mediq-dashboard #mmPermanentIssue #mmPrintReceipt{background:#298dc3!important;color:#fff!important;border-radius:9px!important;margin-top:14px!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-accordion-body{display:block!important} .mm-request-modal .mm-request-body,.mm-request-modal .mm-request-body label,.mm-request-modal .mm-form-section{direction:rtl!important;text-align:right!important} .mm-request-modal #mmSaveIssue{background:#139c71!important;border-color:#139c71!important;color:white!important} .mm-request-modal #mmCancelIssue{background:#d9515a!important;border-color:#d9515a!important;color:white!important} .mm-request-modal .mm-comment-actions button{background:#16946d!important;border-color:#16946d!important;color:white!important} .mm-request-modal .mm-comment-actions{justify-content:flex-start!important} .mm-request-modal .mm-compact-attachments{background:#f3fbfe!important;border:1px solid #c9e2f1!important} @media(max-width:690px){#mediq-dashboard #mmPermanentIssue .mm-handover-grid{grid-template-columns:1fr!important}} </style> <style> /* MediQ V42 — horizontal workflow and clear header/overview */ #mediq-dashboard #mmPermanentIssue>header{background:#eaf6fd!important;border-bottom:1px solid #b9dbed!important;border-radius:12px 12px 0 0!important;min-height:46px!important;padding:10px 12px!important;display:flex!important;align-items:center!important;justify-content:space-between!important;direction:rtl!important} #mediq-dashboard #mmPermanentIssue>header strong{font-size:14px!important;font-weight:900!important;color:#075b8f!important} #mediq-dashboard #mmPermanentIssue>h3{margin:10px 2px 12px!important;padding:0 3px!important;font-size:14px!important;line-height:2!important;color:#154c70!important;font-weight:850!important;text-align:right!important;direction:rtl!important;overflow-wrap:anywhere!important} #mediq-dashboard #mmPermanentIssue>.mm-detail-card:first-of-type{display:block!important} #mediq-dashboard #mmPermanentIssue>.mm-detail-card:first-of-type .mm-accordion-toggle{font-size:15px!important} #mediq-dashboard #mmPermanentIssue>.mm-detail-card:first-of-type .mm-accordion-body{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:9px!important;padding:5px 9px 12px!important} #mediq-dashboard #mmPermanentIssue>.mm-detail-card:first-of-type .mm-detail-line{display:flex!important;flex-direction:column!important;min-height:74px!important;margin:0!important;justify-content:center!important;align-items:stretch!important;background:#fff!important;border:1px solid #cce3f0!important;border-radius:10px!important;padding:10px 12px!important;box-sizing:border-box!important} #mediq-dashboard #mmPermanentIssue>.mm-detail-card:first-of-type .mm-detail-line span{color:#738ca2!important;font-size:12px!important} #mediq-dashboard #mmPermanentIssue>.mm-detail-card:first-of-type .mm-detail-line strong{color:#095e92!important;font-weight:850!important;line-height:1.8!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-accordion-body{min-width:0!important;overflow-x:auto!important;overflow-y:hidden!important;padding:6px 8px 12px!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage-grid{display:flex!important;flex-direction:row!important;align-items:flex-start!important;justify-content:space-between!important;direction:rtl!important;gap:0!important;margin:8px 0!important;min-width:485px!important;width:100%!important;box-sizing:border-box!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage{display:flex!important;flex:1 1 0!important;flex-direction:column!important;align-items:center!important;justify-content:flex-start!important;text-align:center!important;min-height:85px!important;gap:10px!important;padding:5px 2px!important;line-height:1.8!important;font-size:11px!important;white-space:normal!important;border:0!important;background:transparent!important;position:relative!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage::before{position:relative!important;right:auto!important;left:auto!important;top:auto!important;flex:0 0 19px!important;order:0!important;margin:0 auto!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage:not(:last-child)::after{content:''!important;position:absolute!important;right:calc(50% + 14px)!important;left:auto!important;top:15px!important;bottom:auto!important;width:calc(100% - 28px)!important;height:3px!important;background:#d4e4ed!important;z-index:0!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage.done:not(:last-child)::after{background:#17a873!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage.current::before{animation:mediqV3820Pulse 1.1s ease-in-out infinite!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-accordion-body>p{direction:rtl!important;text-align:right!important;line-height:1.9!important;margin:5px 3px!important} @media(max-width:690px){#mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage-grid{min-width:480px!important}} @media(prefers-reduced-motion:reduce){#mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage.current::before{animation:none!important}} </style> <style> /* MEDIQ V43: alignment, compact forms, restored reporting & vivid horizontal workflow */ #mediq-dashboard .mm-card-home .mm-category-grid{display:grid!important;grid-template-columns:repeat(4,minmax(0,1fr))!important;gap:16px!important} #mediq-dashboard .mm-card-home .mm-category-card{min-height:174px!important;padding:19px!important;box-sizing:border-box!important} #mediq-dashboard .mm-card-home .mm-category-card strong{font-size:17px!important;line-height:1.8!important} #mediq-dashboard .mm-card-home .mm-category-card .mm-category-icon{width:75px!important;height:75px!important} #mediq-dashboard .mm-card-home .mm-category-card .mm-category-icon svg{width:45px!important;height:45px!important} #mediq-dashboard #mmContent.mm-with-fixed-side{direction:ltr!important;grid-template-columns:minmax(370px,39%) minmax(0,1fr)!important} #mediq-dashboard #mmContent.mm-with-fixed-side>#mmPermanentIssue{grid-column:1!important;grid-row:4!important;align-self:start!important;min-width:0!important;max-width:100%!important;overflow-x:hidden!important;box-sizing:border-box!important} #mediq-dashboard #mmContent.mm-with-fixed-side>.mm-actionbar{grid-column:2!important;grid-row:3!important} #mediq-dashboard #mmContent.mm-with-fixed-side>#mmRows{grid-column:2!important;grid-row:4!important} #mediq-dashboard #mmPermanentIssue{background:#fff!important;padding:13px!important} #mediq-dashboard #mmPermanentIssue .mm-detail-card{min-width:0!important;overflow:hidden!important} #mediq-dashboard #mmPermanentIssue .mm-detail-card:first-of-type{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:9px!important;padding:12px!important} #mediq-dashboard #mmPermanentIssue .mm-detail-card:first-of-type .mm-accordion-body{display:contents!important} #mediq-dashboard #mmPermanentIssue .mm-detail-card:first-of-type .mm-accordion-toggle{grid-column:1/-1!important;display:block!important} #mediq-dashboard #mmPermanentIssue .mm-detail-card:first-of-type .mm-detail-line{min-width:0!important;word-break:break-word!important;white-space:normal!important} #mediq-dashboard #mmPermanentIssue .mm-workflow{padding:12px!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-accordion-body{display:block!important;overflow:visible!important;padding:7px 0 0!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage-grid{display:flex!important;flex-flow:row nowrap!important;direction:rtl!important;justify-content:space-between!important;min-width:0!important;width:100%!important;gap:3px!important;padding:10px 0!important;overflow:visible!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage{flex:1 1 20%!important;min-width:0!important;min-height:68px!important;padding:3px 0!important;font-size:10px!important;font-weight:750!important;white-space:normal!important;overflow-wrap:anywhere!important;line-height:1.65!important;} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage::before{content:''!important;display:block!important;width:18px!important;height:18px!important;flex:0 0 18px!important;border-radius:50%!important;box-sizing:border-box!important;} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage.done::before{content:'✓'!important;line-height:16px!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage.current::before{animation:mediqV43Active 1.25s ease-in-out infinite!important;background:#199ad0!important;border:4px solid #b6e4fa!important;box-shadow:0 0 0 4px #e8f7ff!important;opacity:1!important} @keyframes mediqV43Active{0%,100%{box-shadow:0 0 0 3px #e8f7ff,0 0 0 5px rgba(23,157,212,.65);transform:scale(1)}50%{box-shadow:0 0 0 3px #e8f7ff,0 0 0 13px rgba(23,157,212,0);transform:scale(1.17)}} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage:not(:last-child)::after{top:12px!important;right:calc(50% + 12px)!important;width:calc(100% - 24px)!important;height:3px!important;bottom:auto!important} #mediq-dashboard #mmPermanentIssue .mm-report-section .mm-report-inner{display:flex!important;flex-direction:column!important;gap:12px!important;padding:12px!important} #mediq-dashboard #mmPermanentIssue .mm-report-section textarea{display:block!important;width:100%!important;min-height:95px!important;box-sizing:border-box!important;border-radius:10px!important;border:1px solid #cbdfee!important;padding:12px!important;text-align:right!important;direction:rtl!important;font:inherit!important} #mediq-dashboard #mmPermanentIssue .mm-report-section button{align-self:flex-start!important;margin-top:8px!important;margin-bottom:3px!important;background:#328fbe!important;color:white!important} #mediq-dashboard #mmPermanentIssue .mm-handover-grid{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:12px!important} #mediq-dashboard #mmPermanentIssue .mm-handover-grid label{min-width:0!important;overflow:hidden!important} #mediq-dashboard #mmPermanentIssue .mm-handover-grid input{min-width:0!important;max-width:100%!important;box-sizing:border-box!important} .mm-request-modal .mm-request-grid>.mm-compact-attachments{grid-column:1!important;grid-row:3!important;align-self:stretch!important;margin:0!important;padding:9px!important;min-width:0!important} .mm-request-modal .mm-request-grid>.mm-compact-attachments h4{font-size:12px!important;margin:0 0 5px!important} .mm-request-modal .mm-request-grid>.mm-compact-attachments .mm-documents{max-height:54px!important;overflow:auto!important;font-size:11px!important} .mm-request-modal .mm-request-grid>.mm-compact-attachments .mm-attach-trigger{max-width:100%!important} .mm-request-modal .mm-request-grid>.mm-wide{grid-column:2!important;grid-row:3!important;min-width:0!important} .mm-request-modal #mmCancelIssue,.mm-request-modal #mmDiscardYes,.mm-request-modal #mmDiscardNo{background:#e8f4fc!important;color:#12699b!important;border:1px solid #afd4e8!important;border-radius:9px!important;font-weight:800!important} .mm-request-modal .mm-discard-card button{font:inherit!important;padding:9px 16px!important;cursor:pointer!important} @media(max-width:1150px){#mediq-dashboard .mm-card-home .mm-category-grid{grid-template-columns:repeat(2,minmax(0,1fr))!important}#mediq-dashboard #mmContent.mm-with-fixed-side{grid-template-columns:minmax(320px,40%) minmax(0,1fr)!important}} @media(max-width:850px){#mediq-dashboard #mmContent.mm-with-fixed-side{grid-template-columns:1fr!important}#mediq-dashboard #mmContent.mm-with-fixed-side>#mmPermanentIssue{grid-column:1!important;grid-row:4!important;position:relative!important;max-height:none!important}#mediq-dashboard #mmContent.mm-with-fixed-side>.mm-actionbar{grid-column:1!important;grid-row:3!important}#mediq-dashboard #mmContent.mm-with-fixed-side>#mmRows{grid-column:1!important;grid-row:5!important}.mm-request-modal .mm-request-grid>.mm-compact-attachments,.mm-request-modal .mm-request-grid>.mm-wide{grid-column:1!important;grid-row:auto!important}} @media(max-width:550px){#mediq-dashboard .mm-card-home .mm-category-grid{grid-template-columns:1fr!important}#mediq-dashboard #mmPermanentIssue .mm-handover-grid{grid-template-columns:1fr!important}} </style> <style> /* MediQ V44 - scoped visual fixes; existing endpoint identifiers remain unchanged */ #mediq-dashboard .mm-card-home .mm-category-grid{grid-template-columns:repeat(4,minmax(0,1fr))!important} #mediq-dashboard .mm-card-home .mm-category-icon{width:88px!important;height:88px!important} #mediq-dashboard .mm-card-home .mm-category-icon svg{width:54px!important;height:54px!important} #mediq-dashboard #mmPermanentIssue .mm-summary-card{padding:12px!important;display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:10px!important} #mediq-dashboard #mmPermanentIssue .mm-summary-card .mm-accordion-body{display:contents!important} #mediq-dashboard #mmPermanentIssue .mm-summary-card .mm-detail-line{min-width:0!important;border:1px solid #d1e4ee!important;border-radius:10px!important;padding:12px!important;background:#fff!important;overflow-wrap:anywhere!important} #mediq-dashboard #mmPermanentIssue .mm-panel-summary{font-size:15px!important;line-height:1.9!important;margin:10px 2px!important;text-align:right!important} #mediq-dashboard #mmPermanentIssue .mm-report-section .mm-accordion-toggle{background:#e8f5fd!important;border:1px solid #b6dcef!important;color:#176890!important;border-radius:10px!important} #mediq-dashboard #mmPermanentIssue .mm-report-section .mm-report-inner{gap:14px!important} #mediq-dashboard #mmPermanentIssue .mm-report-section #mmPanelReportSave{margin-top:10px!important} .mm-request-modal .mm-request-grid{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;align-items:start!important;gap:15px!important} .mm-request-modal .mm-request-grid > label,.mm-request-modal .mm-request-grid > div{min-width:0!important} .mm-request-modal .mm-request-grid > .mm-wide{grid-column:2!important;grid-row:auto!important} .mm-request-modal .mm-request-grid > .mm-compact-attachments{grid-column:1!important;grid-row:auto!important;align-self:stretch!important;background:#fff!important;border:1px solid #cbdfea!important;border-radius:10px!important;box-shadow:none!important;padding:10px!important;margin:0!important} .mm-request-modal .mm-request-grid > .mm-compact-attachments .mm-attach-trigger{background:#fff!important;border:1px dashed #aacfe4!important;border-radius:9px!important;padding:8px!important} .mm-request-modal .mm-request-grid > .mm-compact-attachments .mm-documents{max-height:112px!important;overflow:auto!important} .mm-request-modal #mmCancelIssue{background:#e6525b!important;color:#fff!important;border:1px solid #c93f48!important} .mm-request-modal #mmDiscardYes{background:#e6525b!important;color:#fff!important;border:1px solid #c93f48!important} .mm-request-modal #mmDiscardNo{background:#e9f6ff!important;color:#12699b!important} .mm-request-modal .mm-discard-overlay:not([hidden]){z-index:999!important;display:grid!important;position:absolute!important;inset:0!important;place-items:center!important;background:rgba(20,49,69,.55)!important} .mm-request-modal .mm-discard-card{width:min(90%,450px)!important;padding:28px!important;box-sizing:border-box!important} .mm-request-modal .mm-request-body,.mm-request-modal .mm-request-grid,.mm-request-modal .mm-form-section{direction:rtl!important;text-align:right!important} @media(max-width:850px){.mm-request-modal .mm-request-grid{grid-template-columns:1fr!important}.mm-request-modal .mm-request-grid>.mm-wide,.mm-request-modal .mm-request-grid>.mm-compact-attachments{grid-column:1!important;grid-row:auto!important}#mediq-dashboard .mm-card-home .mm-category-grid{grid-template-columns:repeat(2,minmax(0,1fr))!important}} @media(max-width:550px){#mediq-dashboard .mm-card-home .mm-category-grid{grid-template-columns:1fr!important}} /* V44.1 — uniform accordion appearance: report matches device handover */ #mediq-dashboard #mmPermanentIssue .mm-report-section, #mediq-dashboard #mmPermanentIssue .mm-handover-card { border:1px solid #d1e6f3!important; border-radius:12px!important; background:#fff!important; overflow:hidden!important; } #mediq-dashboard #mmPermanentIssue .mm-report-section > .mm-accordion-toggle, #mediq-dashboard #mmPermanentIssue .mm-handover-card > .mm-accordion-toggle { background:#f2f8fd!important; border:0!important; border-radius:11px!important; color:#125d85!important; min-height:43px!important; padding:12px 11px!important; box-shadow:none!important; text-align:right!important; } #mediq-dashboard #mmPermanentIssue .mm-report-section > .mm-accordion-toggle[aria-expanded="true"], #mediq-dashboard #mmPermanentIssue .mm-handover-card > .mm-accordion-toggle[aria-expanded="true"] { background:#e6f4fc!important; border-bottom:1px solid #cbe5f4!important; border-radius:11px 11px 0 0!important; } #mediq-dashboard #mmPermanentIssue .mm-report-section > .mm-accordion-body, #mediq-dashboard #mmPermanentIssue .mm-handover-card > .mm-accordion-body { padding:11px!important; background:#fff!important; } #mediq-dashboard #mmPermanentIssue .mm-report-section .mm-report-inner { padding:0!important; gap:10px!important; } #mediq-dashboard #mmPermanentIssue .mm-report-section #mmPanelReportSave { margin-top:8px!important; margin-bottom:2px!important; } </style> <style> /* MEDIQ V45 - compact activity panel and self-service layout */ #mediq-dashboard #mmPermanentIssue{padding:9px!important;line-height:1.55!important} #mediq-dashboard #mmPermanentIssue>header{min-height:43px!important;padding:7px 10px!important;margin:0 0 7px!important} #mediq-dashboard #mmPermanentIssue>header strong{font-size:12px!important} #mediq-dashboard #mmPermanentIssue>header button{width:28px!important;height:28px!important} #mediq-dashboard #mmPermanentIssue>h3{font-size:12px!important;line-height:1.65!important;margin:4px 1px 7px!important} #mediq-dashboard #mmPermanentIssue .mm-detail-card{margin:7px 0!important;padding:8px!important;border-radius:10px!important} #mediq-dashboard #mmPermanentIssue .mm-summary-fields, #mediq-dashboard #mmPermanentIssue .mm-summary-card{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:6px!important} #mediq-dashboard #mmPermanentIssue .mm-summary-fields .mm-detail-line, #mediq-dashboard #mmPermanentIssue .mm-summary-card .mm-detail-line{display:flex!important;flex-flow:row wrap!important;align-items:center!important;justify-content:flex-start!important;gap:3px!important;min-height:34px!important;margin:0!important;padding:7px 8px!important;background:#fff!important;border:1px solid #d5e6f2!important;border-radius:8px!important;line-height:1.5!important} #mediq-dashboard #mmPermanentIssue .mm-summary-fields .mm-detail-line span, #mediq-dashboard #mmPermanentIssue .mm-summary-card .mm-detail-line span{flex:0 0 auto!important;width:auto!important;min-width:0!important;font-size:11px!important} #mediq-dashboard #mmPermanentIssue .mm-summary-fields .mm-detail-line span::after, #mediq-dashboard #mmPermanentIssue .mm-summary-card .mm-detail-line span::after{content:' :'!important} #mediq-dashboard #mmPermanentIssue .mm-summary-fields .mm-detail-line strong, #mediq-dashboard #mmPermanentIssue .mm-summary-card .mm-detail-line strong{flex:1 1 auto!important;width:auto!important;min-width:0!important;font-size:11px!important;text-align:right!important} #mediq-dashboard #mmPermanentIssue .mm-workflow{padding:9px 10px!important;min-height:0!important} #mediq-dashboard #mmPermanentIssue .mm-workflow h4{font-size:12px!important;margin:0 0 3px!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-accordion-body{padding:0!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage-grid{padding:2px 0!important;margin:3px 0 0!important;gap:0!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage{min-height:45px!important;padding:3px 1px!important;gap:4px!important;font-size:9px!important;line-height:1.5!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage::before{width:14px!important;height:14px!important;flex-basis:14px!important} #mediq-dashboard #mmPermanentIssue .mm-workflow .mm-stage:not(:last-child)::after{top:10px!important;height:2px!important} #mediq-dashboard #mmPermanentIssue .mm-report-section, #mediq-dashboard #mmPermanentIssue .mm-handover-card{padding:0!important} #mediq-dashboard #mmPermanentIssue .mm-report-section>.mm-accordion-toggle, #mediq-dashboard #mmPermanentIssue .mm-handover-card>.mm-accordion-toggle{min-height:42px!important;padding:8px 12px!important} #mediq-dashboard #mmPermanentIssue .mm-standalone-request{padding:8px!important} #mediq-dashboard #mmPermanentIssue .mm-standalone-request #mmShowRequest{min-height:37px!important} #mediq-dashboard #mufRoot{direction:rtl;text-align:right} #mediq-dashboard .muf-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px} #mediq-dashboard .muf-heading h3{margin:0 0 3px!important} #mediq-dashboard .muf-heading p{font-size:12px;color:#6b879a;margin:0} #mediq-dashboard .muf-stats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:10px 0 16px} #mediq-dashboard .muf-kpi{background:white;border:1px solid #cde2ee;border-top:3px solid var(--kpi-color);border-radius:12px;padding:14px;display:flex;align-items:center;justify-content:space-between;gap:10px;font:inherit;color:#315873;cursor:pointer} #mediq-dashboard .muf-kpi strong{font-size:23px;color:var(--kpi-color);line-height:1} #mediq-dashboard .muf-kpi .muf-kpi-text{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%} #mediq-dashboard .muf-kpi .muf-kpi-text>span:last-child{font-size:13px;color:#547389} #mediq-dashboard .muf-icon{display:inline-grid;place-items:center;min-width:34px;height:34px;border-radius:10px;background:#eef6fb;font-size:18px;line-height:1} #mediq-dashboard .muf-kpi.selected{background:#f0f9fe;box-shadow:0 0 0 1px var(--kpi-color) inset} #mediq-dashboard .muf-tabs{display:flex;gap:8px;border-bottom:1px solid #d5e6ef;margin-bottom:14px;padding-bottom:9px;flex-wrap:wrap} #mediq-dashboard .muf-tabs button{border:1px solid #d0e2ee;border-radius:9px;background:#fff;color:#245f82;padding:9px 14px;font:inherit;font-weight:750;cursor:pointer} #mediq-dashboard .muf-tabs button.active{background:#318fbe;color:#fff;border-color:#318fbe} #mediq-dashboard .muf-filters{display:flex;flex-wrap:wrap;gap:8px;margin:8px 0 14px} #mediq-dashboard .muf-filters input{flex:2;min-width:190px} #mediq-dashboard .muf-filters select{flex:1;min-width:145px} #mediq-dashboard .muf-filters input,#mediq-dashboard .muf-filters select{border:1px solid #cfe2ed;border-radius:9px;background:white;padding:10px;color:#24506a;font:inherit;direction:rtl} #mediq-dashboard .muf-list-shell{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(320px,.85fr);gap:14px;align-items:start} #mediq-dashboard .muf-list{min-width:0} #mediq-dashboard .muf-ticket{width:100%;display:flex;justify-content:space-between;gap:12px;align-items:center;padding:14px 12px;background:white;border:1px solid #dbe8f0;border-radius:9px;text-align:right;direction:rtl;color:#234e68;cursor:pointer;font:inherit;margin:7px 0} #mediq-dashboard .muf-ticket:hover,#mediq-dashboard .muf-ticket.active{background:#f2f9fd;border-color:#8fc6e1} #mediq-dashboard .muf-ticket-main{display:flex;flex-direction:column;align-items:flex-start;gap:4px;min-width:0} #mediq-dashboard .muf-ticket strong{color:#1384b8} #mediq-dashboard .muf-ticket em{font-style:normal;color:#36566b;white-space:normal} #mediq-dashboard .muf-ticket-meta{white-space:nowrap;font-size:11px;color:#6c8798;display:flex;flex-direction:column;align-items:flex-end;gap:3px} #mediq-dashboard .muf-open{color:#d48929}.muf-done{color:#189569} #mediq-dashboard .muf-empty{padding:22px;border:1px dashed #cde1ee;border-radius:10px;background:#f8fcff;color:#68869a;text-align:center} #mediq-dashboard .muf-create{padding:18px;border:1px solid #d1e6f2;border-radius:12px;background:#fff} #mediq-dashboard .muf-create h3{margin:0 0 12px!important} #mediq-dashboard .muf-create-row{display:grid;grid-template-columns:1.2fr .7fr .8fr 1.5fr auto;gap:12px;align-items:end} #mediq-dashboard .muf-create label{display:flex;flex-direction:column;gap:6px;font-size:12px;font-weight:750;color:#2b607f;min-width:0} #mediq-dashboard .muf-create .muf-grow{min-width:0} #mediq-dashboard .muf-create input,#mediq-dashboard .muf-create select,#mediq-dashboard .muf-create textarea{padding:10px;border:1px solid #cfe2ee;border-radius:9px;background:#fff;font:inherit;min-width:0;direction:rtl;text-align:right} #mediq-dashboard .muf-create textarea{resize:vertical;min-height:48px} #mediq-dashboard .muf-create button{align-self:end;white-space:nowrap} #mediq-dashboard .muf-note{border:1px solid #dae8f1;border-radius:10px;padding:12px;margin:9px 0;background:#fff} #mediq-dashboard .muf-note.compact{padding:10px} #mediq-dashboard .muf-note strong,#mediq-dashboard .muf-note small{display:block} #mediq-dashboard .muf-note small{color:#7995a7;margin:5px 0} #mediq-dashboard .muf-note p{margin:5px 0;white-space:pre-wrap} #mediq-dashboard .muf-side-panel{position:sticky;top:16px;border:1px solid #d1e6f2;border-radius:14px;background:#fff;min-height:320px;padding:14px;box-shadow:0 12px 28px #0f39550f} #mediq-dashboard .muf-panel-empty,#mediq-dashboard .muf-panel-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;min-height:250px;color:#67859a;gap:8px} #mediq-dashboard .muf-panel-empty-icon{font-size:28px;color:#2d8dc0} #mediq-dashboard .muf-side-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:10px} #mediq-dashboard .muf-close-mini{border:1px solid #cfe2ee;background:#f2f8fc;color:#25678f;border-radius:9px;padding:4px 10px;cursor:pointer;font:inherit} #mediq-dashboard .muf-side-title h4{margin:0;color:#167bb0} #mediq-dashboard .muf-side-title p{margin:5px 0 0;color:#42657b;line-height:1.8} #mediq-dashboard .muf-side-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:12px 0} #mediq-dashboard .muf-side-grid>div{padding:10px;background:#f3f9fc;border:1px solid #d6e7f0;border-radius:9px;display:grid;grid-template-columns:34px 1fr;column-gap:8px;align-items:center} #mediq-dashboard .muf-side-grid>div span{font-size:11px;color:#7891a2;display:block} #mediq-dashboard .muf-side-grid>div strong{display:block;color:#244b63} #mediq-dashboard .muf-side-grid>div .muf-icon{grid-row:1/span 2} #mediq-dashboard .muf-side-box{margin-top:12px;border:1px solid #d8e8f1;border-radius:11px;padding:12px;background:#fbfdff} #mediq-dashboard .muf-side-box h5{margin:0 0 8px!important;color:#225c7f} #mediq-dashboard .muf-description{white-space:pre-wrap;line-height:1.9;margin:0} #mediq-dashboard .muf-workflow{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:6px;align-items:start} #mediq-dashboard .muf-work-step{text-align:center;position:relative;padding-top:4px} #mediq-dashboard .muf-work-step:not(:last-child)::after{content:"";position:absolute;top:14px;left:-50%;width:100%;height:2px;background:#d9e8f2;z-index:0} #mediq-dashboard .muf-work-step:first-child::after{display:none} #mediq-dashboard .muf-step-dot{width:16px;height:16px;border-radius:50%;display:inline-block;background:#cfe1ec;border:3px solid #eef7fc;position:relative;z-index:1} #mediq-dashboard .muf-work-step.done .muf-step-dot{background:#60bce8} #mediq-dashboard .muf-work-step.current .muf-step-dot{background:#1e9dd9;box-shadow:0 0 0 0 rgba(30,157,217,.55);animation:mufPulse 1.4s infinite} #mediq-dashboard .muf-work-step small{display:block;margin-top:8px;color:#567186;line-height:1.7} #mediq-dashboard .muf-error{color:#b42e38} #mediq-dashboard #mufRoot [hidden]{display:none!important} @keyframes mufPulse{0%{box-shadow:0 0 0 0 rgba(30,157,217,.45)}70%{box-shadow:0 0 0 12px rgba(30,157,217,0)}100%{box-shadow:0 0 0 0 rgba(30,157,217,0)}} @media(max-width:980px){#mediq-dashboard .muf-list-shell{grid-template-columns:1fr}#mediq-dashboard .muf-side-panel{position:static}#mediq-dashboard .muf-create-row{grid-template-columns:1fr 1fr}} @media(max-width:700px){#mediq-dashboard .muf-stats{grid-template-columns:1fr}#mediq-dashboard .muf-create-row{grid-template-columns:1fr}#mediq-dashboard .muf-side-grid,#mediq-dashboard .muf-workflow{grid-template-columns:1fr}#mediq-dashboard .muf-ticket{flex-direction:column;align-items:flex-start}#mediq-dashboard .muf-ticket-meta{align-items:flex-start;white-space:normal}} </style> <style> /* MediQ V46.3 — notification spacing and consistent dashboard workflow */ #mediq-dashboard #mufRoot #mufPaneNotes{ padding:16px 14px 18px!important; margin-top:12px!important; background:#fff!important; border:1px solid #d5e7f2!important; border-radius:13px!important; box-sizing:border-box!important; } #mediq-dashboard #mufRoot #mufMarkRead{ display:inline-flex!important; align-items:center!important; justify-content:center!important; min-height:38px!important; margin:0 0 16px!important; padding:8px 15px!important; } #mediq-dashboard #mufRoot #mufNotes{margin-top:4px!important;clear:both!important;} #mediq-dashboard #mufRoot #mufNotes>.muf-empty{ margin:0!important; padding:20px 16px!important; min-height:75px!important; display:flex!important; align-items:center!important; justify-content:center!important; } #mediq-dashboard #mufRoot #mufNotes>.muf-note:first-child{margin-top:0!important;} #mediq-dashboard #mufRoot .muf-side-panel{ border-color:#c6e1f1!important; box-shadow:0 5px 18px rgba(25,83,123,.07)!important; min-height:0!important; } #mediq-dashboard #mufRoot .muf-side-box{margin-top:11px!important;padding:12px!important;background:#fff!important;} #mediq-dashboard #mufRoot .muf-side-grid>div{padding:9px!important;} #mediq-dashboard #mufRoot .muf-side-panel{padding:12px!important} #mediq-dashboard #mufRoot .muf-side-title.compact{margin-bottom:8px!important} #mediq-dashboard #mufRoot .muf-request-box{border:1px solid #d6e8f2;border-radius:12px;padding:10px;background:#fbfdff} #mediq-dashboard #mufRoot .muf-request-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px} #mediq-dashboard #mufRoot .muf-field{border:1px solid #dbe8f0;border-radius:10px;padding:10px;background:#fff;min-width:0} #mediq-dashboard #mufRoot .muf-field span{display:block;font-size:12px;color:#6f8a9d;margin-bottom:5px} #mediq-dashboard #mufRoot .muf-field strong{display:block;color:#244b63;line-height:1.9} #mediq-dashboard #mufRoot .muf-field p{margin:0;color:#37576d;line-height:1.9} #mediq-dashboard #mufRoot .muf-field.muf-priority-inline strong{display:flex;align-items:center} #mediq-dashboard #mufRoot .muf-priority-badge{display:inline-flex;align-items:center;gap:6px} #mediq-dashboard #mufRoot .muf-attachments{grid-column:1} #mediq-dashboard #mufRoot .muf-device{grid-column:1/-1;display:grid;grid-template-columns:auto 1fr;gap:10px;align-items:center} #mediq-dashboard #mufRoot .muf-device>span,#mediq-dashboard #mufRoot .muf-device>strong{grid-column:2} #mediq-dashboard #mufRoot .muf-device-image{width:58px;height:58px;object-fit:cover;border-radius:12px;border:1px solid #d9e8f2;background:#f5fbff;grid-row:1/span 2} #mediq-dashboard #mufRoot .muf-action-box .muf-workflow{margin-top:8px} #mediq-dashboard #mufRoot .muf-inline-flow-head{margin-bottom:8px} #mediq-dashboard #mufRoot .muf-mini-status{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:999px;background:#eef8fd;border:1px solid #cae4f2;color:#205a79;font-size:12px} #mediq-dashboard #mufRoot .muf-assign-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:end;margin-top:10px} #mediq-dashboard #mufRoot .muf-assign-row label,#mediq-dashboard #mufRoot .muf-note-entry{display:block} #mediq-dashboard #mufRoot .muf-assign-row input,#mediq-dashboard #mufRoot .muf-note-entry textarea{width:100%;box-sizing:border-box;padding:9px 10px;border:1px solid #cddfea;border-radius:10px;font:inherit} #mediq-dashboard #mufRoot .muf-help-inline{display:block;margin-top:6px;color:#6a8597;line-height:1.8} #mediq-dashboard #mufRoot .muf-transition-wrap{margin-top:10px} #mediq-dashboard #mufRoot .muf-transition-wrap>span{display:block;font-size:12px;color:#6f8a9d;margin-bottom:6px} #mediq-dashboard #mufRoot .muf-transition-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:8px} #mediq-dashboard #mufRoot .muf-transition-tile{padding:10px 8px;border:1px solid #cfe3ef;border-radius:10px;background:#fff;color:#1f5978;font:inherit;cursor:pointer;transition:.18s ease} #mediq-dashboard #mufRoot .muf-transition-tile:hover,#mediq-dashboard #mufRoot .muf-transition-tile.chosen{background:#eaf7ff;border-color:#49a6d8;transform:translateY(-1px)} #mediq-dashboard #mufRoot .muf-note-entry{margin-top:10px} #mediq-dashboard #mufRoot .muf-note-entry textarea{min-height:72px;resize:vertical} #mediq-dashboard #mufRoot .muf-inline-actions{display:flex;gap:8px;justify-content:flex-start;flex-wrap:wrap;margin-top:10px} #mediq-dashboard #mufRoot #mufInlineResult{margin:8px 0 0;color:#2b6787;line-height:1.8} @media(max-width:980px){#mediq-dashboard #mufRoot .muf-request-grid{grid-template-columns:1fr}#mediq-dashboard #mufRoot .muf-device{grid-template-columns:1fr}#mediq-dashboard #mufRoot .muf-device>span,#mediq-dashboard #mufRoot .muf-device>strong{grid-column:1}#mediq-dashboard #mufRoot .muf-device-image{grid-row:auto;justify-self:start;margin-bottom:8px}#mediq-dashboard #mufRoot .muf-assign-row{grid-template-columns:1fr}} #mediq-dashboard #mufRoot .muf-workflow{ display:flex!important; flex-direction:row!important; direction:rtl!important; gap:0!important; width:100%!important; padding:9px 0 0!important; margin:0!important; align-items:flex-start!important; } #mediq-dashboard #mufRoot .muf-work-step{ flex:1 1 0!important; min-width:0!important; padding:0 2px!important; text-align:center!important; position:relative!important; } #mediq-dashboard #mufRoot .muf-work-step::after{ content:''!important; position:absolute!important; z-index:0!important; top:8px!important; right:calc(50% + 9px)!important; left:auto!important; width:calc(100% - 18px)!important; height:2px!important; background:#d3e5ef!important; } #mediq-dashboard #mufRoot .muf-work-step:first-child::after{display:block!important;} #mediq-dashboard #mufRoot .muf-work-step:last-child::after{display:none!important;} #mediq-dashboard #mufRoot .muf-step-dot{ display:block!important; width:15px!important; height:15px!important; margin:0 auto!important; border-radius:50%!important; background:#e2edf3!important; border:2px solid #c7deeb!important; box-shadow:0 0 0 3px white!important; position:relative!important; z-index:2!important; } #mediq-dashboard #mufRoot .muf-work-step.done .muf-step-dot{ background:#72bfdf!important; border-color:#72bfdf!important; } #mediq-dashboard #mufRoot .muf-work-step.current .muf-step-dot{ background:#158fc9!important; border:3px solid #b8e7fb!important; animation:mediqUserFaultCurrentPulse 1.15s ease-in-out infinite!important; will-change:box-shadow,transform!important; } #mediq-dashboard #mufRoot .muf-work-step small{ display:block!important; margin-top:9px!important; font-size:10px!important; line-height:1.65!important; color:#6e8da0!important; overflow-wrap:normal!important; } #mediq-dashboard #mufRoot .muf-work-step.current small{color:#097dae!important;font-weight:850!important;} @keyframes mediqUserFaultCurrentPulse{ 0%,100%{box-shadow:0 0 0 3px #e6f5fc,0 0 0 5px rgba(28,150,210,.48);transform:scale(1);opacity:1;} 50%{box-shadow:0 0 0 3px #e6f5fc,0 0 0 11px rgba(28,150,210,0);transform:scale(1.16);opacity:.65;} } @media(max-width:700px){ #mediq-dashboard #mufRoot .muf-workflow{display:flex!important;flex-direction:row!important;} #mediq-dashboard #mufRoot .muf-work-step small{font-size:9px!important;} #mediq-dashboard #mufRoot #mufPaneNotes{padding:12px!important;} } @media(prefers-reduced-motion:reduce){ #mediq-dashboard #mufRoot .muf-work-step.current .muf-step-dot{animation:none!important;} } </style> <style> /* MediQ V46.4 - isolated fixes */ #mediq-dashboard #mufRoot .muf-device-combo{position:relative;width:100%;min-width:0} #mediq-dashboard #mufRoot #mufDeviceSearch{display:block;width:100%;min-height:43px;padding:10px 12px;border:1px solid #cfe2ee;border-radius:9px;background:white;box-sizing:border-box;font:inherit;text-align:right;direction:rtl} #mediq-dashboard #mufRoot .muf-device-results{position:absolute;top:calc(100% + 3px);right:0;left:0;max-height:300px;overflow:auto;z-index:1005;padding:5px;border:1px solid #b9d9ec;background:white;border-radius:10px;box-shadow:0 12px 28px #123d5529} #mediq-dashboard #mufRoot .muf-device-results[hidden]{display:none!important} #mediq-dashboard #mufRoot .muf-device-results button{display:block;width:100%;padding:10px 9px;background:white;border:0;border-radius:7px;text-align:right;direction:rtl;font:inherit;font-size:12px;color:#215b7b;cursor:pointer;white-space:normal} #mediq-dashboard #mufRoot .muf-device-results button:hover,#mediq-dashboard #mufRoot .muf-device-results button:focus{background:#e7f5fe} #mediq-dashboard #mufRoot #mufPaneNew{overflow:visible!important} #mediq-dashboard #mufRoot #mufNotes{margin-top:18px!important} #mediq-dashboard #mqTree [data-tree-key="property"].parent-active,#mediq-dashboard #mqTree [data-tree-key="property"].active{background:#287fb1!important;color:white!important;box-shadow:inset -3px 0 0 #c7efff!important} #mediq-dashboard #mmContent .v-stats>.mm-kpi-card{display:grid!important;grid-template-columns:minmax(0,1fr) 43px!important;grid-template-rows:auto auto!important;gap:5px 10px!important;min-height:106px!important;padding:14px!important;align-content:center!important} #mediq-dashboard #mmContent .v-stats>.mm-kpi-card strong{grid-column:1!important;grid-row:1!important;font-size:26px!important;align-self:center} #mediq-dashboard #mmContent .v-stats>.mm-kpi-card span{grid-column:1/-1!important;grid-row:2!important;font-size:12px!important} #mediq-dashboard #mmContent .v-stats>.mm-kpi-card::before{grid-column:2!important;grid-row:1!important;position:static!important;display:grid!important;width:37px!important;height:37px!important;font-size:22px!important;align-self:center!important} .mm-request-box .mm-form-section:first-child .mm-request-grid{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:15px!important;align-items:start!important} .mm-request-box .mm-form-section:first-child .mm-request-grid>label{display:flex!important;flex-direction:column!important;min-width:0!important;grid-column:auto!important} .mm-request-box .mm-form-section:first-child .mm-request-grid>label.mm-wide{grid-column:1!important} .mm-request-box .mm-compact-attachments{grid-column:2!important;grid-row:auto!important;min-width:0!important;margin:0!important;padding:0!important;border:0!important;align-self:stretch!important} .mm-request-box .mm-compact-attachments .mm-attach-trigger{display:flex!important;flex-direction:column!important;align-items:stretch!important;justify-content:center!important;width:100%!important;min-height:94px!important;background:#fff!important;border:1px solid #c7dfed!important} .mm-request-box .mm-compact-attachments input[type=file]{max-width:100%!important;width:100%!important} .mm-request-box .mm-request-grid textarea#mmEditDescription{min-height:94px!important} .mm-request-box .mm-transition-screen{grid-column:1/-1;border:1px solid #d1e5f1;border-radius:10px;padding:14px;margin:10px 0;background:#f9fcff;min-width:0} .mm-request-box .mm-transition-screen[hidden]{display:none!important} .mm-request-box .mm-transition-screen h4{margin:0 0 12px!important;color:#17638c} .mm-request-box .mm-transition-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px} .mm-request-box .mm-transition-field{display:flex;flex-direction:column;gap:5px;min-width:0} .mm-request-box .mm-transition-field input,.mm-request-box .mm-transition-field select,.mm-request-box .mm-transition-field textarea{display:block;width:100%;min-width:0;font:inherit;font-size:13px;border:1px solid #bfdbe9;border-radius:8px;padding:9px;box-sizing:border-box;background:white} .mm-request-box .mm-transition-error,.mm-request-box .mm-transition-unsupported{color:#b53c48;font-size:12px;line-height:1.9} .mm-request-box .mm-actions{justify-content:flex-start!important;gap:9px!important} @media(max-width:680px){.mm-request-box .mm-form-section:first-child .mm-request-grid,.mm-request-box .mm-transition-grid{grid-template-columns:1fr!important}.mm-request-box .mm-form-section:first-child .mm-request-grid>label.mm-wide,.mm-request-box .mm-compact-attachments{grid-column:1!important}} </style> <style id="mediq-v46-5-layout-fixes"> /* Correct action form: description and attachments share the same row. */ .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid{ display:grid!important;grid-template-columns:minmax(0,1fr) minmax(0,1fr)!important; gap:12px 14px!important;align-items:stretch!important; } .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label.mm-wide{ grid-column:1!important;grid-row:3!important;margin:0!important; min-width:0!important;height:100%!important; } .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > .mm-compact-attachments{ grid-column:2!important;grid-row:3!important;margin:0!important; min-width:0!important;padding:0!important;align-self:stretch!important; background:transparent!important;border:0!important; display:flex!important;flex-direction:column!important;justify-content:flex-end!important; } .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label.mm-wide textarea#mmEditDescription{ width:100%!important;min-height:110px!important;height:110px!important; box-sizing:border-box!important;resize:vertical!important; } .mm-request-modal .mm-compact-attachments > h4{margin:0 0 5px!important;font-size:12px!important} .mm-request-modal .mm-compact-attachments .mm-documents{ margin:0 0 4px!important;max-height:35px!important;overflow-y:auto!important;font-size:11px!important; } .mm-request-modal .mm-compact-attachments .mm-attach-trigger{ flex:1!important;min-height:64px!important;max-height:110px!important; background:#fff!important;border:1px dashed #a9d2e7!important; border-radius:9px!important;padding:8px!important; display:flex!important;justify-content:center!important;align-items:center!important; } .mm-request-modal .mm-compact-attachments input[type=file]{box-sizing:border-box!important;width:100%!important;max-width:100%!important} .mm-request-modal .mm-transition-screen:empty{display:none!important} .mm-request-modal .mm-transition-screen .mm-transition-note{display:none!important} @media(max-width:700px){ .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid{grid-template-columns:minmax(0,1fr)!important} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label.mm-wide, .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > .mm-compact-attachments{ grid-column:1!important;grid-row:auto!important;height:auto!important; } } </style> <style> /* MediQ V46.6 - independent workflow transition screen */ .mm-t-screen-overlay{position:fixed;inset:0;z-index:2147483000;display:grid;place-items:center;padding:18px;font-family:Vazir,IRANSans,Tahoma,sans-serif;box-sizing:border-box;direction:rtl} .mm-t-screen-backdrop{position:absolute;inset:0;background:rgba(14,45,67,.57);backdrop-filter:blur(3px)} .mm-t-screen-card{position:relative;z-index:1;width:min(760px,96vw);max-height:88vh;display:flex;flex-direction:column;overflow:hidden;border-radius:18px;border:1px solid #c4e1f2;box-shadow:0 22px 65px rgba(13,50,78,.25);background:#fff;color:#205477;text-align:right} .mm-t-screen-card header{padding:20px 24px;background:#eef8ff;border-bottom:1px solid #d3e9f7;display:flex;align-items:flex-start;justify-content:space-between;gap:15px} .mm-t-screen-card header strong{font-size:19px;color:#11668f}.mm-t-screen-card header p{font-size:12px;margin:7px 0 0;color:#718b9c} .mm-t-screen-card button{cursor:pointer;font-family:inherit}.mm-t-x{background:#fff;border:1px solid #cce4f2;border-radius:10px;color:#25648b;padding:5px 12px;font-size:20px} .mm-t-screen-body{padding:20px 24px;overflow:auto;min-height:75px} .mm-t-screen-card .mm-transition-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px} .mm-t-screen-card .mm-transition-field{display:flex;flex-direction:column;gap:8px;min-width:0;font-weight:700;font-size:13px} .mm-t-screen-card .mm-transition-field>input:not([type=hidden]),.mm-t-screen-card .mm-transition-field>select,.mm-t-screen-card .mm-transition-field>textarea{width:100%;box-sizing:border-box;min-height:43px;border-radius:10px;border:1px solid #bedced;background:#fff;color:#254e67;padding:10px;font-family:inherit;font-size:13px} .mm-t-screen-card .mm-transition-field>textarea{resize:vertical}.mm-t-required{color:#d43e54} .mm-t-checklist{display:grid;gap:9px;padding:12px;border:1px solid #d8e7f0;border-radius:10px}.mm-t-checklist label{font-weight:500} .mm-t-asset-results{max-height:185px;overflow:auto;display:flex;flex-direction:column;gap:4px}.mm-t-asset-results button{text-align:right;background:#f1f8fc;border:1px solid #dceaf3;border-radius:8px;padding:8px;color:#245b79} .mm-t-asset-results button:hover{background:#dff2fd}.mm-t-screen-error,.mm-transition-error{color:#c33d4e;font-size:12px;line-height:1.8} .mm-t-screen-card footer{display:flex;justify-content:flex-start;gap:10px;padding:15px 24px;border-top:1px solid #e1edf5;background:#fbfdff} .mm-t-screen-card footer button{font-size:13px;font-weight:700;border:1px solid #bcddec;border-radius:10px;min-height:40px;padding:9px 19px;background:#eff8ff;color:#1b678f} .mm-t-screen-card footer .mm-t-ok{color:#fff;background:#129b72;border-color:#129b72} @media(max-width:650px){.mm-t-screen-card .mm-transition-grid{grid-template-columns:1fr}.mm-t-screen-card header,.mm-t-screen-body{padding:15px}} </style> <style id="mediq-v467-transition-style"> .mm-t-screen-card{width:min(830px,96vw)!important} .mm-t-screen-card .mm-t-comment{margin-top:18px} .mm-t-screen-card .mm-t-comment textarea{width:100%;min-height:86px;box-sizing:border-box;border:1px solid #bedced;border-radius:10px;padding:12px;font:inherit;color:#254e67;resize:vertical} .mm-t-screen-card footer .mm-t-ok{background:#159b70!important;border-color:#159b70!important;color:#fff!important;font-weight:800} /* V46.8: restore action footer hidden by the global Confluence-shell footer rule. */ .mm-t-screen-overlay .mm-t-screen-card > footer{ display:flex!important; visibility:visible!important; opacity:1!important; flex-shrink:0!important; align-items:center!important; justify-content:flex-start!important; gap:12px!important; padding:14px 24px!important; background:#f6fbff!important; border-top:1px solid #d5e9f5!important; position:relative!important; z-index:2!important; } .mm-t-screen-overlay .mm-t-screen-card > footer > button{display:inline-flex!important;align-items:center;justify-content:center;min-height:42px} .mm-t-screen-card .mm-t-screen-error:not(:empty){margin-top:12px;padding:10px;border:1px solid #edbbc2;border-radius:8px;background:#fff4f4} .mm-t-screen-card .mm-transition-field{position:relative} .mm-t-screen-card .mm-t-asset-results{max-height:185px;overflow:auto} </style> <style id="mediq-v49-3-ui-fix"> /* Preserve the original dashboard and tighten ONLY the existing request/action interfaces. */ #mediq-dashboard #mufRoot .muf-heading{display:flex!important;align-items:center!important;justify-content:space-between!important;gap:12px!important;flex-wrap:wrap!important} #mediq-dashboard #mufRoot .muf-heading>div:first-child{margin-inline-start:0!important;margin-inline-end:auto!important} #mediq-dashboard #mufRoot .mq-v49-fault-toolbar{display:flex!important;flex-direction:row!important;align-items:center!important;gap:9px!important;flex-shrink:0!important;margin-inline-start:auto!important} #mediq-dashboard #mufRoot .mq-v49-fault-toolbar>button{position:static!important;margin:0!important;min-width:unset!important;white-space:nowrap!important} #mediq-dashboard #mufRoot .mq-v49-fault-toolbar .mq-v47-newfault{background:#df4451!important;color:white!important;border-color:#df4451!important} #mediq-dashboard #mufRoot .mq-v49-fault-toolbar .mq-v47-newfault:hover{background:#c72f3c!important;transform:translateY(-3px) rotate(-1deg)!important} .mm-request-box .mm-request-body{padding-top:4px!important} .mm-request-box .mm-form-section{padding:10px 12px!important;margin:7px 0!important} .mm-request-box .mm-request-grid{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:7px 10px!important} .mm-request-box .mm-request-grid>label{min-width:0!important;margin:0!important} .mm-request-box .mm-request-grid>label:has(#mmEditAssignee){display:none!important} .mm-request-box .mm-request-grid .mq-v49-stage-label{grid-column:1/-1!important;order:15!important} .mm-request-box .mq-v49-stage-label>select{display:none!important} .mm-request-box .mq-v49-stage-label .mm-transition-tiles{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;margin:6px 0!important;gap:8px!important} .mm-request-box .mq-v49-stage-label .mm-transition-tile{min-height:42px!important} .mm-request-box .mm-request-grid .mq-v47-status{min-height:39px!important;padding:5px 9px!important;align-self:center!important} .mm-request-box .mm-request-grid .mq-v47-priority{padding:5px 8px!important;min-height:35px!important} .mm-request-box .mm-request-grid>label:has(#mmEditSummary){order:0!important} .mm-request-box .mm-request-grid>label:has(#mmEditPriority){order:1!important} .mm-request-box .mm-request-grid>label.mm-wide{order:5!important} .mm-request-box .mm-request-grid .mm-compact-attachments{order:6!important} .mm-request-box .mm-request-grid .mq-v47-device{order:8!important;grid-column:1/-1!important;margin:1px 0!important} .mm-request-box .mm-request-grid>label:has(#mmEditDescription) textarea{min-height:55px!important;height:75px!important;resize:vertical!important} .mm-request-box .mm-request-grid .mm-compact-attachments{border:0!important;box-shadow:none!important} .mm-request-box .mq-v47-action .mq-v47-help{margin:4px 0!important} .mm-request-box .mq-v47-action .mq-v47-actions-container{display:flex!important;flex-direction:column!important;gap:8px!important} .mm-request-box .mq-v49-inline-stage-host:empty{display:none!important} .mm-request-box .mq-v49-transition-inline{position:relative!important;inset:auto!important;z-index:auto!important;display:block!important;background:none!important;overflow:visible!important;padding:0!important} .mm-request-box .mq-v49-transition-inline .mm-t-screen-backdrop{display:none!important} .mm-request-box .mq-v49-transition-inline .mm-t-screen-card{position:relative!important;inset:auto!important;transform:none!important;display:block!important;max-height:none!important;overflow:visible!important;max-width:none!important;width:100%!important;margin:0!important;border:1px solid #c8e3f3!important;box-shadow:none!important;border-radius:10px!important} .mm-request-box .mq-v49-transition-inline .mm-t-screen-card header{padding:9px 12px!important} .mm-request-box .mq-v49-transition-inline .mm-t-screen-body{padding:10px!important;max-height:320px!important;overflow-y:auto!important} .mm-request-box .mq-v49-transition-inline .mm-t-screen-card footer{padding:8px 10px!important} .mm-request-box .mq-v49-transition-inline .mm-transition-grid{gap:8px!important} @media(max-width:750px){.mm-request-box .mm-request-grid{grid-template-columns:1fr!important}.mm-request-box .mq-v49-stage-label .mm-transition-tiles{grid-template-columns:1fr!important}#mediq-dashboard #mufRoot .muf-heading{align-items:flex-start!important}} </style> <style id="mediq-v49-4-request-layout"> /* V49.4: precise rearrangement of existing nodes, retaining their IDs and save handlers */ .mm-request-box .mm-request-grid{grid-template-columns:minmax(0,1.8fr) minmax(0,1fr) minmax(0,.78fr)!important;gap:8px!important;align-items:end!important} .mm-request-box .mm-request-grid>label:has(#mmEditSummary){grid-column:1!important;grid-row:1!important;order:0!important} .mm-request-box .mm-request-grid>.mq-v47-status{grid-column:3!important;grid-row:1!important;order:0!important;min-height:40px!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-start!important;gap:7px!important;white-space:nowrap!important} .mm-request-box .mm-request-grid>.mq-v47-status span{font-weight:700!important;font-size:12px!important} .mm-request-box .mm-request-grid>.mq-v47-status strong{font-size:12px!important} .mm-request-box .mm-request-grid>label:has(#mmEditPriority){grid-column:2!important;grid-row:1!important;order:0!important;min-height:40px!important;display:flex!important;align-items:center!important;justify-content:flex-start!important;gap:7px!important;margin:0!important;font-weight:750!important} .mm-request-box .mm-request-grid>label:has(#mmEditPriority) .mq-v47-priority{display:inline-flex!important;min-height:36px!important;padding:2px 4px!important;gap:5px!important;background:transparent!important;border:0!important} .mm-request-box .mq-v494-icon{display:block!important;width:32px!important;height:32px!important;object-fit:cover!important;border-radius:8px!important} .mm-request-box .mq-v494-importance-text{font-size:11px!important;color:#52728b!important} .mm-request-box .mm-request-grid>label:has(#mmEditDescription){grid-column:1/3!important;grid-row:2!important;order:0!important;align-self:stretch!important} .mm-request-box .mm-request-grid>label:has(#mmEditDescription) textarea{height:92px!important;min-height:92px!important;max-height:105px!important} .mm-request-box .mm-request-grid>.mm-compact-attachments{grid-column:3!important;grid-row:2!important;order:0!important;align-self:stretch!important;padding:0!important} .mm-request-box .mm-request-grid>.mm-compact-attachments .mm-documents{max-height:35px!important;min-height:15px!important;margin:0 0 4px!important} .mm-request-box .mm-request-grid>.mm-compact-attachments .mm-attach-trigger{margin-top:3px!important} .mm-request-box .mq-v47-device{grid-column:1/-1!important;grid-row:3!important;order:0!important;min-height:66px!important;margin:0!important} .mm-request-box .mq-v47-device .mq-v47-product-image{max-height:82px!important} .mm-request-box .mq-v47-action{padding:11px 12px!important} .mm-request-box .mq-v47-action .mq-v47-help{margin:0 0 8px!important} .mm-request-box .mq-v494-action-row{display:grid!important;grid-template-columns:minmax(0,1.35fr) minmax(0,1fr)!important;gap:14px!important;align-items:start!important;direction:rtl!important} .mm-request-box .mq-v494-action-row>label{min-width:0!important;margin:0!important} .mm-request-box .mq-v494-action-row>.mq-v49-stage-label{grid-column:1!important;grid-row:1!important;order:0!important;display:block!important} .mm-request-box .mq-v494-action-row>.mq-v49-stage-label>.mm-transition-tiles{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:7px!important;margin:6px 0!important} .mm-request-box .mq-v494-action-row>.mq-v49-stage-label .mm-transition-tile{min-height:43px!important;cursor:pointer!important} .mm-request-box .mq-v494-action-row>label:has(#mmEditAssignee){grid-column:2!important;grid-row:1!important;display:flex!important;flex-direction:column!important;gap:6px!important} .mm-request-box .mq-v494-action-row .mq-v47-self{align-self:flex-start!important;padding:0!important;margin:0!important} .mm-request-box .mq-v49-inline-stage-host{margin-top:4px!important} .mm-request-box .mq-v47-action .mm-actions{margin-top:7px!important} .mm-request-box .mq-v47-notes{margin-top:8px!important} @media(max-width:780px){.mm-request-box .mm-request-grid{grid-template-columns:1fr 1fr!important}.mm-request-box .mm-request-grid>label:has(#mmEditSummary){grid-column:1/-1!important;grid-row:1!important}.mm-request-box .mm-request-grid>.mq-v47-status{grid-column:2!important;grid-row:2!important}.mm-request-box .mm-request-grid>label:has(#mmEditPriority){grid-column:1!important;grid-row:2!important}.mm-request-box .mm-request-grid>label:has(#mmEditDescription){grid-column:1/-1!important;grid-row:3!important}.mm-request-box .mm-request-grid>.mm-compact-attachments{grid-column:1/-1!important;grid-row:4!important}.mm-request-box .mq-v47-device{grid-row:5!important}.mm-request-box .mq-v494-action-row{grid-template-columns:1fr!important}.mm-request-box .mq-v494-action-row>.mq-v49-stage-label{grid-column:1!important;grid-row:1!important}.mm-request-box .mq-v494-action-row>label:has(#mmEditAssignee){grid-column:1!important;grid-row:2!important}} </style> <style id="mediq-v49-5-alignment-fix"> /* V49.5 - targeted layout correction only; no endpoint or event handler changes. */ .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid{ display:grid!important; grid-template-columns:repeat(6,minmax(0,1fr))!important; grid-template-rows:auto auto auto!important; column-gap:10px!important;row-gap:12px!important; align-items:stretch!important;direction:rtl!important; } .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label:has(#mmEditSummary){grid-column:1/3!important;grid-row:1!important;order:0!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label:has(#mmEditPriority){grid-column:3/5!important;grid-row:1!important;order:0!important;display:flex!important;flex-direction:row!important;justify-content:center!important;align-items:center!important;gap:8px!important;padding:8px 10px!important;min-height:70px!important;background:#f5faff!important;border:1px solid #c9e1f1!important;border-radius:9px!important;box-sizing:border-box!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > .mq-v47-status{grid-column:5/7!important;grid-row:1!important;order:0!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:center!important;gap:7px!important;min-height:70px!important;height:auto!important;padding:8px 10px!important;box-sizing:border-box!important;background:#f5faff!important;border:1px solid #c9e1f1!important;border-radius:9px!important;white-space:normal!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label:has(#mmEditSummary){display:flex!important;flex-direction:column!important;justify-content:center!important;align-items:stretch!important;gap:7px!important;min-height:70px!important;padding:7px 10px!important;box-sizing:border-box!important;background:#f5faff!important;border:1px solid #c9e1f1!important;border-radius:9px!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label:has(#mmEditSummary) input{width:100%!important;min-height:34px!important;margin:0!important;box-sizing:border-box!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label:has(#mmEditPriority) .mq-v47-priority{display:inline-flex!important;align-items:center!important;justify-content:center!important;gap:7px!important;padding:0!important;margin:0!important;border:0!important;background:transparent!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label:has(#mmEditPriority) .mq-v494-icon{width:28px!important;height:28px!important;object-fit:contain!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label:has(#mmEditDescription){grid-column:1/4!important;grid-row:2!important;order:0!important;display:flex!important;flex-direction:column!important;min-height:127px!important;height:127px!important;gap:6px!important;box-sizing:border-box!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label:has(#mmEditDescription) textarea#mmEditDescription{flex:1!important;display:block!important;min-height:0!important;height:100%!important;max-height:none!important;resize:none!important;box-sizing:border-box!important;width:100%!important;margin:0!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > .mm-compact-attachments{grid-column:4/7!important;grid-row:2!important;order:0!important;min-height:127px!important;height:127px!important;display:flex!important;flex-direction:column!important;justify-content:flex-start!important;box-sizing:border-box!important;margin:0!important;padding:0!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > .mm-compact-attachments > h4{margin:0 0 6px!important;line-height:20px!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > .mm-compact-attachments .mm-documents{flex:0 0 auto!important;min-height:19px!important;max-height:32px!important;overflow:auto!important;margin:0 0 5px!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > .mm-compact-attachments .mm-attach-trigger{flex:1!important;min-height:0!important;max-height:none!important;width:100%!important;box-sizing:border-box!important;margin:0!important;display:flex!important;justify-content:center!important;align-items:center!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > .mq-v47-device{grid-column:1/7!important;grid-row:3!important;order:0!important;width:100%!important;box-sizing:border-box!important;min-height:62px!important;margin:0!important;padding:8px 10px!important;} .mm-request-modal .mm-request-box .mq-v47-action .mq-v494-action-row{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;align-items:start!important;gap:12px!important;direction:rtl!important;} .mm-request-modal .mm-request-box .mq-v47-action .mq-v494-action-row > .mq-v49-stage-label{grid-column:1!important;grid-row:1!important;min-width:0!important;display:flex!important;flex-direction:column!important;gap:6px!important;align-items:stretch!important;margin:0!important;} .mm-request-modal .mm-request-box .mq-v47-action .mq-v494-action-row > label:has(#mmEditAssignee){grid-column:2!important;grid-row:1!important;min-width:0!important;display:flex!important;flex-direction:column!important;gap:6px!important;align-items:stretch!important;margin:0!important;} .mm-request-modal .mm-request-box .mq-v47-action .mq-v494-action-row > label:has(#mmEditAssignee) input#mmEditAssignee{box-sizing:border-box!important;width:100%!important;min-height:42px!important;margin:0!important;} .mm-request-modal .mm-request-box .mq-v47-action .mq-v494-action-row .mm-transition-tiles{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:8px!important;margin:0!important;} .mm-request-modal .mm-request-box .mq-v47-action .mq-v494-action-row .mm-transition-tile{min-height:42px!important;margin:0!important;} .mm-request-modal .mm-request-box .mq-v47-action .mq-v494-action-row .mq-v47-self{margin-top:1px!important;align-self:flex-start!important;} @media(max-width:700px){ .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid{grid-template-columns:repeat(2,minmax(0,1fr))!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label:has(#mmEditSummary){grid-column:1/3!important;grid-row:1!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label:has(#mmEditPriority){grid-column:1!important;grid-row:2!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > .mq-v47-status{grid-column:2!important;grid-row:2!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > label:has(#mmEditDescription){grid-column:1/3!important;grid-row:3!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > .mm-compact-attachments{grid-column:1/3!important;grid-row:4!important;} .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid > .mq-v47-device{grid-column:1/3!important;grid-row:5!important;} .mm-request-modal .mm-request-box .mq-v47-action .mq-v494-action-row{grid-template-columns:1fr!important;} .mm-request-modal .mm-request-box .mq-v47-action .mq-v494-action-row > .mq-v49-stage-label{grid-column:1!important;grid-row:1!important;} .mm-request-modal .mm-request-box .mq-v47-action .mq-v494-action-row > label:has(#mmEditAssignee){grid-column:1!important;grid-row:2!important;} } </style> <style id="mediq-v49-6-attachments-flow-report"> /* V49.6: preserves existing IDs and action submission semantics */ .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid>.mq-v47-status{ width:100%!important;min-width:0!important;min-height:70px!important;height:70px!important; justify-content:center!important;align-self:stretch!important;box-sizing:border-box!important; font-size:12px!important;display:flex!important;gap:5px!important; } .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid>label:has(#mmEditPriority), .mm-request-modal .mm-request-box .mm-form-section:first-child .mm-request-grid>label:has(#mmEditSummary){height:70px!important;min-height:70px!important;box-sizing:border-box!important} .mm-request-modal .mm-compact-attachments{background:#f8fbfe!important;border:1px solid #c9e1f1!important;border-radius:9px!important;padding:8px!important;overflow:hidden!important} .mm-request-modal .mm-compact-attachments>.mm-documents{display:flex!important;flex-flow:row wrap!important;align-content:flex-start!important;gap:5px!important;max-height:65px!important;min-height:28px!important;overflow-y:auto!important;overflow-x:hidden!important;margin-bottom:7px!important} .mm-request-modal .mm-compact-attachments .mm-doc-pill{display:inline-flex!important;max-width:100%!important;min-width:0!important;overflow-wrap:anywhere!important;white-space:normal!important;text-decoration:none!important;background:white!important;border:1px solid #b6dff0!important;border-radius:7px!important;padding:4px 7px!important;color:#145b85!important;font-size:11px!important} .mm-request-modal .mm-compact-attachments .mm-attach-trigger{min-height:39px!important;flex:0 0 auto!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:space-between!important;padding:6px!important} .mm-request-modal .mm-compact-attachments input[type=file]{width:100%!important;min-width:0!important} .mm-request-modal .mm-compact-attachments .mm-attach-trigger:not(:has(input[type=file]:focus)){box-shadow:none!important} .mm-request-modal .mq-v496-flow{direction:rtl;grid-column:1/-1;width:100%;box-sizing:border-box;background:#f4faff;border:1px solid #d0e7f6;border-radius:9px;padding:9px 11px;margin:0 0 6px} .mm-request-modal .mq-v496-flow-title{font-size:12px;font-weight:800;color:#155a80;margin-bottom:7px;text-align:right} .mm-request-modal .mq-v496-flow-content{display:flex;align-items:center;flex-wrap:wrap;gap:8px;font-size:11px;color:#2f6887} .mm-request-modal .mq-v496-stage-current{background:#e8f7ff;color:#00699b;border:1px solid #a8d6ef;border-radius:8px;padding:7px 11px;display:inline-flex;align-items:center;gap:7px;font-weight:800} .mm-request-modal .mq-v496-stage-current i{display:inline-block;height:9px;width:9px;background:#159bd1;border-radius:50%;animation:mqV496Pulse 1.3s ease-in-out infinite} .mm-request-modal .mq-v496-next{background:#fff;border:1px solid #c4dfef;padding:7px 10px;border-radius:8px} @keyframes mqV496Pulse{0%,100%{box-shadow:0 0 0 2px #d6f0fd;opacity:1}50%{box-shadow:0 0 0 7px #d6f0fd;opacity:.45}} @media(prefers-reduced-motion:reduce){.mm-request-modal .mq-v496-stage-current i{animation:none}} </style> <style id="mediq-v49-7-action-workflow"> /* V49.7 – action timeline mirrors the five-stage activity dashboard. */ .mm-request-modal .mq-v497-flow{display:block!important;width:100%!important;min-width:0!important;box-sizing:border-box!important;direction:rtl!important;padding:9px 12px 7px!important;margin:0 0 8px!important;border:1px solid #c8e2f4!important;border-radius:11px!important;background:#fff!important;overflow:hidden!important} .mm-request-modal .mq-v497-flow h4{font-size:12px!important;font-weight:800!important;text-align:right!important;color:#12618a!important;margin:0 0 5px!important;padding:0!important} .mm-request-modal .mq-v497-flow .mm-stage-grid{display:flex!important;flex-flow:row nowrap!important;direction:rtl!important;align-items:flex-start!important;justify-content:space-between!important;gap:0!important;margin:0!important;padding:4px 0 0!important;min-width:0!important;width:100%!important;overflow:visible!important} .mm-request-modal .mq-v497-flow .mm-stage{position:relative!important;display:flex!important;flex:1 1 20%!important;min-width:0!important;min-height:44px!important;flex-direction:column!important;align-items:center!important;justify-content:flex-start!important;gap:5px!important;padding:2px 1px!important;border:0!important;background:transparent!important;color:#718da1!important;font-size:10px!important;line-height:1.6!important;font-weight:650!important;text-align:center!important;white-space:normal!important;overflow-wrap:anywhere!important} .mm-request-modal .mq-v497-flow .mm-stage::before{content:''!important;position:relative!important;display:block!important;order:0!important;flex:0 0 13px!important;width:13px!important;height:13px!important;margin:0 auto!important;background:#e3eff6!important;border:2px solid #c5deeb!important;border-radius:50%!important;box-sizing:border-box!important;z-index:2!important} .mm-request-modal .mq-v497-flow .mm-stage:not(:last-child)::after{content:''!important;position:absolute!important;display:block!important;top:8px!important;right:calc(50% + 9px)!important;left:auto!important;bottom:auto!important;width:calc(100% - 18px)!important;height:2px!important;background:#d3e5ee!important;z-index:1!important} .mm-request-modal .mq-v497-flow .mm-stage.done::before{background:#70c5e4!important;border-color:#70c5e4!important} .mm-request-modal .mq-v497-flow .mm-stage.done:not(:last-child)::after{background:#70c5e4!important} .mm-request-modal .mq-v497-flow .mm-stage.current{color:#087cb6!important;font-weight:800!important} .mm-request-modal .mq-v497-flow .mm-stage.current::before{background:#159bd1!important;border:3px solid #b6e7fb!important;box-shadow:0 0 0 4px #e5f6fd!important;animation:mqV497Active 1.25s ease-in-out infinite!important} @keyframes mqV497Active{0%,100%{box-shadow:0 0 0 3px #d9f2fc;transform:scale(1)}50%{box-shadow:0 0 0 7px #e7f7ff;transform:scale(1.12)}} @media (prefers-reduced-motion:reduce){.mm-request-modal .mq-v497-flow .mm-stage.current::before{animation:none!important}} </style> <style id="mediq-v49-12-upload-layout"> /* Repair upload controls inside the existing request modal. Scoped and responsive. */ .mm-request-modal .mm-request-grid > .mm-compact-attachments{ display:flex!important;flex-direction:column!important;gap:5px!important; overflow:hidden!important;padding:8px 10px!important;min-width:0!important; justify-content:flex-start!important;box-sizing:border-box!important; } .mm-request-modal .mm-compact-attachments>h4{flex:none!important;margin:0!important;line-height:17px!important;font-size:11px!important} .mm-request-modal .mm-compact-attachments .mm-documents{ flex:none!important;display:flex!important;flex-flow:row wrap!important;align-items:center!important; gap:4px!important;overflow-y:auto!important;overflow-x:hidden!important; max-height:30px!important;min-height:18px!important;margin:0!important;padding:0!important; } .mm-request-modal .mm-compact-attachments .mm-doc-pill{white-space:nowrap!important;max-width:100%!important;overflow:hidden!important;text-overflow:ellipsis!important;padding:2px 6px!important;font-size:10px!important} .mm-request-modal .mm-compact-attachments .mm-attach-controls{ display:grid!important;grid-template-columns:minmax(0,1fr) auto!important;align-items:center!important; gap:7px!important;width:100%!important;min-width:0!important;flex:none!important; } .mm-request-modal .mm-compact-attachments .mm-attach-trigger{ display:flex!important;align-items:center!important;justify-content:flex-start!important;flex-direction:column!important; width:100%!important;min-width:0!important;min-height:0!important;max-height:none!important; height:auto!important;padding:4px 6px!important;margin:0!important;gap:3px!important; box-sizing:border-box!important;border:1px solid #c6e1ef!important;background:#fff!important; } .mm-request-modal .mm-compact-attachments .mm-file-label{display:none!important} .mm-request-modal .mm-compact-attachments input#mmIssueFile{ position:static!important;display:block!important;width:100%!important;max-width:100%!important; min-width:0!important;height:27px!important;margin:0!important;padding:2px!important; border:0!important;box-shadow:none!important;outline-offset:1px!important;background:transparent!important; font-size:10px!important;line-height:20px!important;direction:ltr!important;box-sizing:border-box!important; } .mm-request-modal .mm-compact-attachments #mmUploadIssue{ flex:none!important;position:static!important;display:inline-flex!important;align-items:center!important; justify-content:center!important;width:auto!important;min-width:90px!important;min-height:33px!important; padding:6px 9px!important;margin:0!important;white-space:nowrap!important;font-size:10px!important; } .mm-request-modal .mm-compact-attachments #mmUploadIssue:disabled{opacity:.48!important;cursor:not-allowed!important} .mm-request-modal .mm-compact-attachments .mm-upload-message{ flex:none!important;display:block!important;width:100%!important;min-width:0!important; font-size:10px!important;line-height:1.6!important;overflow:hidden!important; white-space:nowrap!important;text-overflow:ellipsis!important;color:#35617a!important;margin:0!important; } @media(max-width:650px){ .mm-request-modal .mm-compact-attachments .mm-attach-controls{grid-template-columns:minmax(0,1fr)!important} .mm-request-modal .mm-compact-attachments #mmUploadIssue{width:100%!important} .mm-request-modal .mm-request-grid > .mm-compact-attachments{height:auto!important;min-height:125px!important} } </style> <style id="mediq-receipt-dana-two-copies"> #mediq-dashboard .mm-handover-card, #mediq-dashboard .mm-handover-card *, #mediq-dashboard .mm-handover-card input, #mediq-dashboard .mm-handover-card button, #mediq-dashboard .mm-handover-card label{font-family:inherit!important} </style> <style id="mediq-v49-27-handover-refinement"> #mediq-dashboard .mq-handover-workspace{padding:18px!important} #mediq-dashboard .mq-handover-workspace .mq-assets-head{margin:0 0 12px!important;min-height:36px!important} #mediq-dashboard #mqV48HandoverSummary.v-stats{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:14px!important;margin:0 0 14px!important;padding:0!important;width:100%!important;direction:rtl!important} #mediq-dashboard #mqV48HandoverSummary>.mm-kpi-card{position:relative!important;box-sizing:border-box!important;width:100%!important;min-width:0!important;height:86px!important;min-height:86px!important;margin:0!important;padding:14px 16px!important;display:grid!important;grid-template-columns:minmax(0,1fr) 42px!important;grid-template-rows:auto auto!important;align-content:center!important;align-items:center!important;column-gap:12px!important;row-gap:4px!important;text-align:right!important;direction:rtl!important;border:1px solid #c5dfef!important;border-top:3px solid #258fd1!important;border-radius:12px!important;background:#fff!important;box-shadow:0 4px 12px rgba(25,98,145,.06)!important;cursor:pointer!important;font-family:inherit!important} #mediq-dashboard #mqV48HandoverSummary>.mm-kpi-card:nth-child(2){border-top-color:#ef9d29!important} #mediq-dashboard #mqV48HandoverSummary>.mm-kpi-card.active{background:#eaf7ff!important;border-color:#249bdc!important;box-shadow:0 0 0 1px #9edfff inset!important} #mediq-dashboard #mqV48HandoverSummary>.mm-kpi-card::before{display:none!important;content:none!important} #mediq-dashboard #mqV48HandoverSummary .mq-handover-icon{grid-column:2!important;grid-row:1/3!important;display:flex!important;align-items:center!important;justify-content:center!important;width:42px!important;height:42px!important;background:#e5f4fd!important;border-radius:11px!important;font:bold 24px Tahoma,Arial,sans-serif!important;color:#208dca!important} #mediq-dashboard #mqV48HandoverSummary>.mm-kpi-card:nth-child(2) .mq-handover-icon{background:#fff1df!important;color:#d88b18!important} #mediq-dashboard #mqV48HandoverSummary .mm-kpi-card strong{grid-column:1!important;grid-row:1!important;font-size:27px!important;line-height:1.2!important;color:#198cca!important;margin:0!important;text-align:right!important} #mediq-dashboard #mqV48HandoverSummary .mq-handover-label{grid-column:1!important;grid-row:2!important;font-size:12px!important;color:#62809c!important;text-align:right!important} #mediq-dashboard .mq-handover-workspace .mm-actionbar{margin:0 0 12px!important;padding:0!important} #mediq-dashboard .mq-handover-workspace .mm-actionbar input{max-width:none!important;width:100%!important;min-height:36px!important;box-sizing:border-box!important} #mediq-dashboard .mq-handover-table-wrap{max-height:420px!important;overflow:auto!important;border-radius:12px!important;overscroll-behavior:contain} #mediq-dashboard .mq-handover-table-wrap table{width:100%!important} #mediq-dashboard .mq-handover-documents{margin:5px 0 0;font-size:12px;color:#167b67} #mediq-dashboard .mq-handover-documents summary{cursor:pointer;font-weight:750;width:max-content;max-width:100%;border:1px solid #c5e6db;border-radius:6px;padding:4px 8px;background:#f0faf7} #mediq-dashboard .mq-handover-document{display:flex;flex-wrap:wrap;gap:5px 12px;padding:7px 3px;border-bottom:1px solid #e5edf3;font-size:11px;color:#315b73} #mediq-dashboard #mqTree [data-v32-nav="handover"].active{background:#d9efff!important;color:#0e5685!important;border-right:3px solid #f5fbff!important;border-radius:7px!important;font-weight:850!important} #mediq-dashboard #mqTree [data-tree-key="property"].active{background:#2b83b7!important;color:#fff!important;font-weight:850!important} /* Floating Persian date pickers never increase the transition form's height. */ .mm-t-screen-overlay .mm-cal,.mm-request-modal .mm-cal{position:fixed!important;z-index:2147483600!important;max-width:min(330px,calc(100vw - 20px))!important;width:310px!important;max-height:min(370px,calc(100vh - 20px))!important;overflow:auto!important;margin:0!important;background:#fff!important;box-shadow:0 15px 45px rgba(19,67,98,.24)!important} @media(max-width:700px){#mediq-dashboard #mqV48HandoverSummary.v-stats{gap:8px!important}#mediq-dashboard #mqV48HandoverSummary>.mm-kpi-card{height:82px!important;min-height:82px!important;padding:10px!important}} </style> <style id="mediq-v4928-styles"> #mediq-dashboard .mq-v4928-notice{padding:14px 16px!important;margin:0 0 10px!important;border:1px solid #c9dfee!important;border-radius:12px!important;background:#fff!important;min-height:0!important;text-align:right!important} #mediq-dashboard .mq-v4928-notice-top{display:flex;justify-content:space-between;gap:12px;align-items:center;flex-wrap:wrap} #mediq-dashboard .mq-v4928-notice-top strong{font-size:13px;color:#125780} #mediq-dashboard .mq-v4928-notice-top small{font-size:11px;color:#738ba0} #mediq-dashboard .mq-v4928-notice-sub{font-size:12px;font-weight:700;color:#314f68;margin:7px 0} #mediq-dashboard .mq-v4928-notice p{margin:7px 0 9px;color:#42627b;line-height:1.9} #mediq-dashboard .mq-v4928-notice-actions{display:flex;justify-content:flex-start} #mediq-dashboard .mq-v4928-rating{display:flex;direction:ltr;justify-content:flex-end;gap:3px;margin:10px 0} #mediq-dashboard .mq-v4928-rating button{cursor:pointer;border:0;background:transparent;font:30px Arial,sans-serif;color:#c8d3df;padding:2px 4px} #mediq-dashboard .mq-v4928-rating button.selected{color:#f5a623} /* MediQ CSAT V49.31 - emoji are multicolor, so text-color alone cannot show selection. */ #mediq-dashboard #mufRoot .mq-v4928-rating{gap:8px!important;align-items:center!important;justify-content:flex-end!important;flex-wrap:wrap!important} #mediq-dashboard #mufRoot .mq-v4928-rating button{display:inline-flex!important;align-items:center!important;justify-content:center!important;min-width:43px!important;height:43px!important;border:2px solid transparent!important;border-radius:12px!important;padding:4px!important;background:#f4f8fc!important;box-shadow:none!important;cursor:pointer!important;pointer-events:auto!important;opacity:1!important;filter:none!important;transition:background .15s,border-color .15s,box-shadow .15s,transform .15s!important} #mediq-dashboard #mufRoot .mq-v4928-rating button:hover{background:#eaf5ff!important;transform:translateY(-2px)!important} #mediq-dashboard #mufRoot .mq-v4928-rating button.selected,#mediq-dashboard #mufRoot .mq-v4928-rating button[aria-pressed="true"]{background:#e0f2ff!important;border-color:#2493ce!important;box-shadow:0 0 0 3px rgba(36,147,206,.16)!important;transform:scale(1.09)!important} #mediq-dashboard #mufRoot .mq-v4928-rating button:focus-visible{outline:3px solid #2493ce!important;outline-offset:3px!important} #mediq-dashboard #mufRoot .mq-csat-selected-label{display:block;font-size:11px;font-weight:750;color:#296486;background:#f5faff;padding:5px 10px;border-radius:8px;min-height:25px;text-align:right} #mediq-dashboard #mufRoot .mq-csat-choice:has(input:checked){background:#e4f4ff!important;border-color:#309bce!important;box-shadow:0 0 0 1px #aedaf2 inset!important} #mediq-dashboard .mq-v4928-survey textarea{display:block;box-sizing:border-box;width:100%;margin-bottom:10px;border:1px solid #c5dff0;border-radius:8px;padding:10px;font:inherit} /* V49.32: detached accessible CSAT modal, no survey embedded inside issue side panel. */ #mediq-dashboard .mq-csat-modal{position:fixed!important;inset:0!important;z-index:2147483000!important;display:flex!important;justify-content:center!important;align-items:center!important;padding:18px!important;direction:rtl!important} #mediq-dashboard .mq-csat-modal[hidden]{display:none!important} #mediq-dashboard .mq-csat-modal-backdrop{position:absolute;inset:0;background:rgba(17,43,65,.62);backdrop-filter:blur(3px)} #mediq-dashboard .mq-csat-modal-dialog{position:relative;z-index:1;width:min(620px,96vw);max-height:min(90vh,760px);display:flex;flex-direction:column;overflow:hidden;background:#fff;border:1px solid #bdddec;border-radius:20px;box-shadow:0 22px 80px rgba(10,47,78,.28);font-family:inherit;color:#24475f} #mediq-dashboard .mq-csat-modal-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px 24px;background:linear-gradient(135deg,#e8f6ff,#fff);border-bottom:1px solid #d1e5f1} #mediq-dashboard .mq-csat-modal-header strong{display:block;font-size:18px;font-weight:850;color:#155b86} #mediq-dashboard .mq-csat-modal-header small{display:block;font-size:12px;color:#6b8798;margin-top:7px} #mediq-dashboard .mq-csat-modal-dismiss{width:36px;height:36px;flex:0 0 36px;border:1px solid #cfe4f2;border-radius:9px;background:#fff;color:#386e8d;font-size:25px;cursor:pointer} #mediq-dashboard .mq-csat-modal-body{padding:20px 24px 24px;overflow:auto;min-height:0} #mediq-dashboard .mq-csat-modal-body .mq-v4928-survey{display:block!important;margin:0!important;border:0!important;padding:0!important;background:transparent!important} #mediq-dashboard .mq-csat-modal-body .mq-v4928-survey>h5{display:none!important} #mediq-dashboard .mq-csat-modal-body .mq-v4928-rating{display:flex!important;gap:12px!important;justify-content:center!important;flex-wrap:wrap!important;margin:18px 0!important;direction:ltr!important} #mediq-dashboard .mq-csat-modal-body .mq-v4928-rating button{display:inline-flex!important;align-items:center!important;justify-content:center!important;width:58px!important;height:58px!important;border:2px solid transparent!important;border-radius:14px!important;background:#f4f8fc!important;cursor:pointer!important;font-size:32px!important;transition:.15s!important} #mediq-dashboard .mq-csat-modal-body .mq-v4928-rating button:hover{background:#e9f5ff!important;transform:translateY(-2px)} #mediq-dashboard .mq-csat-modal-body .mq-v4928-rating button.selected,#mediq-dashboard .mq-csat-modal-body .mq-v4928-rating button[aria-pressed="true"]{border-color:#2493ce!important;background:#e0f2ff!important;box-shadow:0 0 0 3px rgba(36,147,206,.16)!important;transform:scale(1.06)!important} #mediq-dashboard .mq-csat-modal-body .mq-csat-selected-label{background:#f4f9fd;padding:10px;border-radius:9px;font-size:12px;color:#23618a;text-align:center} #mediq-dashboard .mq-csat-modal-body .mq-csat-categories{display:flex;gap:8px;flex-wrap:wrap;margin:20px 0} #mediq-dashboard .mq-csat-modal-body .mq-csat-choice:has(input:checked){background:#e4f4ff!important;border-color:#309bce!important} #mediq-dashboard .mq-csat-modal-body textarea{display:block;width:100%;min-height:95px;resize:vertical;padding:12px;border:1px solid #c5dff0;border-radius:10px;font:inherit;box-sizing:border-box;direction:rtl} #mediq-dashboard .mq-csat-modal-body #mqV4928SurveySave{display:block;margin:14px 0 0;min-height:43px} #mediq-dashboard .mq-csat-modal-body #mqV4928SurveyMessage{font-size:12px;line-height:1.9;color:#2d6e8d} @media(max-width:600px){#mediq-dashboard .mq-csat-modal-dialog{max-height:94vh}#mediq-dashboard .mq-csat-modal-body{padding:14px}#mediq-dashboard .mq-csat-modal-header{padding:14px}#mediq-dashboard .mq-csat-modal-body .mq-v4928-rating button{width:49px!important;height:49px!important;font-size:27px!important}} #mediq-dashboard #mqTree .v32-tree-children .mq-tree-row.level-2,#mediq-dashboard #mmTreeChildren [data-mm-tree]{box-sizing:border-box!important;width:100%!important;min-height:35px!important;padding:9px 14px!important;font-size:12px!important;line-height:1.5!important;text-align:right!important} #mediq-dashboard #mqTree .v32-tree-children .mq-tree-row.level-2.active{background:#63a9d3!important;border-right:3px solid #fff!important;color:#fff!important} #mediq-dashboard #mqTree .mq-tree-row.level-1.parent-active{background:#2b82b3!important;color:#fff!important} </style> <script> /* MEDIQ V49.30 - Persian numeral presentation for dashboard cards (text only). */ (function(){ 'use strict'; var selectors=[ '#mediq-dashboard .mm-kpi-card', '#mediq-dashboard .muf-kpi', '#mediq-dashboard .mm-stat-card', '#mediq-dashboard .mq-stat-card', '#mediq-dashboard .mq-home-card', '#mediq-dashboard .mq-handover-icon', '#mediq-dashboard [data-handover-filter]', '#mediq-dashboard .mq-v48-stat', '#mediq-dashboard .mm-category-card', '#mediq-dashboard .mm-summary-card', '#mediq-dashboard .mq-v48-card', '#mediq-dashboard .mq-card', '#mediq-dashboard .muf-stats', '#mediq-dashboard [class*="kpi"]', '#mediq-dashboard [class*="stat-card"]', '#mediq-dashboard [class*="summary-card"]', '#mediq-dashboard [class*="metric-card"]' ].join(','); var digits='۰۱۲۳۴۵۶۷۸۹'; var guard=false; function convert(node){ if(!node || !node.isConnected)return; var walker=document.createTreeWalker(node,NodeFilter.SHOW_TEXT,null),t; while((t=walker.nextNode())){ if(!/[0-9]/.test(t.nodeValue))continue; var parent=t.parentElement; if(parent && parent.closest('script,style,code,pre,textarea,input,select,[contenteditable="true"]'))continue; t.nodeValue=t.nodeValue.replace(/[0-9]/g,function(d){return digits[d.charCodeAt(0)-48];}); } } function apply(){ if(guard)return; guard=true; try{document.querySelectorAll(selectors).forEach(convert);}finally{guard=false;} } var pending=false; function schedule(){ if(pending)return; pending=true; requestAnimationFrame(function(){pending=false;apply();}); } if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',schedule,{once:true});else schedule(); var root=document.getElementById('mediq-dashboard'); if(root){new MutationObserver(function(mutations){ if(guard)return; for(var i=0;i<mutations.length;i++){ if(mutations[i].type==='childList'||mutations[i].type==='characterData'){schedule();break;} } }).observe(root,{subtree:true,childList:true,characterData:true});} })(); </script></pre></td></tr></table><p class="bidi-direction-rtl"><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p>
Edit
Save
Close
Preview
View changes
Revert to last published version
{"serverDuration": 403, "requestCorrelationId": "7aedcc72512dd500"}