<div id="mediq-dashboard" dir="rtl">
<style>
/* ============================================================
MEDIQ DASHBOARD - SUPPLY
PRESENTATION VERSION
============================================================ */
#mediq-dashboard,
#mediq-dashboard * {
box-sizing: border-box;
}
#mediq-dashboard {
--navy: #073553;
--navy-dark: #062d49;
--primary: #08b9b0;
--primary-dark: #069e98;
--text: #173b59;
--muted: #748b9e;
--border: #dce9ef;
--bg: #f4f9fb;
--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(9,185,176,.09),
transparent 27%
),
#f4f9fb;
}
/* ============================================================
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
============================================================ */
.mq-sidebar {
grid-column: 2;
height: 100vh;
padding:
24px
17px;
direction: rtl;
color: #fff;
display: flex;
flex-direction: column;
background:
linear-gradient(
180deg,
#073b5c 0%,
#062e4a 100%
);
box-shadow:
-12px 0 45px
rgba(7,53,83,.11);
}
/* LOGO */
.mq-logo {
width: 100%;
text-align: center;
padding:
3px
5px
22px;
border-bottom:
1px solid
rgba(255,255,255,.10);
}
.mq-logo img {
width: 174px;
max-width: 92%;
height: auto;
}
/* USER */
.mq-user {
margin-top: 17px;
padding:
14px
15px;
border-radius: 14px;
background:
rgba(255,255,255,.065);
border:
1px solid
rgba(255,255,255,.08);
}
.mq-user-name {
font-size: 12px;
font-weight: 900;
}
.mq-user-role {
margin-top: 6px;
color:
rgba(255,255,255,.58);
font-size: 9px;
font-weight: 600;
}
/* ============================================================
LIFE CYCLE
============================================================ */
.mq-life-title {
margin:
26px
7px
9px;
color:
rgba(255,255,255,.39);
font-size: 9px;
font-weight: 700;
}
.mq-life {
display: flex;
flex-direction: column;
gap: 6px;
}
.mq-life-item {
position: relative;
min-height: 46px;
padding:
0
13px;
border-radius: 11px;
display: flex;
align-items: center;
gap: 10px;
color:
rgba(255,255,255,.69);
font-size: 11px;
font-weight: 800;
cursor: pointer;
user-select: none;
transition:
background .15s ease,
color .15s ease,
transform .15s ease;
}
.mq-life-item:hover {
color: #fff;
background:
rgba(255,255,255,.075);
}
.mq-life-item.active {
color: #fff;
background:
linear-gradient(
90deg,
#08b9b0,
#079e99
);
box-shadow:
0 10px 23px
rgba(8,185,176,.18);
}
.mq-life-icon {
width: 28px;
height: 28px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
background:
rgba(255,255,255,.07);
}
.mq-life-item.active
.mq-life-icon {
background:
rgba(255,255,255,.14);
}
.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;
}
.mq-logout {
min-height: 43px;
padding:
0
13px;
border-radius: 10px;
display: flex;
align-items: center;
gap: 9px;
color:
rgba(255,255,255,.65);
font-size: 10px;
font-weight: 700;
cursor: pointer;
}
.mq-logout:hover {
color: #fff;
background:
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,
#073b5c,
#087c7d
);
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(16,222,205,.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(8,185,176,.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,
#e9fbf9,
#d9f7f3
);
}
.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(8,185,176,.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:
#e7faf8;
}
.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:
#f1faf9;
}
.mq-list-option.active {
color:
#087f7a;
background:
#e9f9f7;
}
.mq-option-badge {
width: 26px;
height: 26px;
border-radius: 7px;
display: flex;
align-items: center;
justify-content: center;
background:
rgba(8,185,176,.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:
#e6f9f7;
}
.mq-demo-text {
color:
#557287;
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,
#08aaa4,
#0bc1b8
);
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,#08b9b0,#079e99);
}
.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(8,185,176,.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(8,185,176,.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:#073553 !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:#eafaf8;
border-color:#9fded9;
color:#078f89 !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(8,185,176,.08);
}
/* MEDIQ -> CONFIFORMS BRIDGE */
.confiforms-registration-control {
position: fixed !important;
left: -10000px !important;
top: -10000px !important;
width: 1px !important;
height: 1px !important;
overflow: hidden !important;
opacity: 0 !important;
pointer-events: auto !important;
}
/* ============================================================
MEDIQ CONFIFORMS MODAL
============================================================ */
#mqCfModal {
position: fixed;
inset: 0;
z-index: 10050;
display: none;
align-items: center;
justify-content: center;
padding: 24px;
background: rgba(3, 35, 55, .48);
backdrop-filter: blur(3px);
direction: rtl;
}
#mqCfModal.open { display: flex; }
#mqCfDialog {
width: min(620px, 94vw);
max-height: 88vh;
overflow: auto;
background: #fff;
border: 1px solid #dce9ef;
border-radius: 20px;
box-shadow: 0 28px 80px rgba(3,35,55,.24);
}
#mqCfHeader {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 18px 22px;
border-bottom: 1px solid #e4eef2;
}
#mqCfHeader strong {
color: #073553;
font-size: 16px;
font-weight: 900;
}
#mqCfClose {
width: 34px;
height: 34px;
border: 0;
border-radius: 9px;
background: #f1f6f8;
color: #557287;
font: 700 20px/34px Tahoma,Arial,sans-serif;
cursor: pointer;
}
#mqCfClose:hover { background: #e6f4f4; color: #069e98; }
#mqCfBody { padding: 8px 18px 18px; }
/* The real ConfiForms registration panel is moved here at runtime */
#mqCfBody .confiFormsFormBorder {
width: 100% !important;
margin: 0 !important;
border: 0 !important;
box-shadow: none !important;
}
#mqCfBody .confiFormsFormTitle { display: none !important; }
#mqCfBody .confiFormsFormContent { padding: 16px 4px !important; }
#mqCfBody .confiFormsFormFooter {
padding: 14px 4px 4px !important;
background: transparent !important;
}
#mqCfBody table { width: 100% !important; }
#mqCfBody td {
border: 0 !important;
padding: 8px !important;
text-align: right !important;
}
#mqCfBody input[type="text"],
#mqCfBody input[type="password"],
#mqCfBody textarea,
#mqCfBody select {
width: 100% !important;
max-width: none !important;
min-width: 0 !important;
min-height: 40px;
border-radius: 9px !important;
direction: rtl;
}
#mqCfBody .entry_metadata_button,
#mqCfBody .entry_metadata { display: none !important; }
#mqCfBody .save-cf-btn {
min-width: 130px;
min-height: 40px;
border: 0 !important;
border-radius: 9px !important;
background: linear-gradient(90deg,#08aaa4,#0bc1b8) !important;
color: #fff !important;
font-family: inherit !important;
font-weight: 800 !important;
cursor: pointer;
}
/* ============================================================
MEDIQ - REAL PURCHASED ASSETS LIST (ConfiForms TableView)
============================================================ */
#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,#08aaa4,#0bc1b8);
}
#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 #dce9ef !important;
border-radius: 12px !important;
overflow: hidden !important;
}
#mediq-dashboard .mq-assets-host th {
padding: 12px 14px !important;
text-align: right !important;
background: #f3f8fa !important;
color: #47677d !important;
border-bottom: 1px solid #dce9ef !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 #edf3f6 !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;
}
/* ConfiForms delete proxy inside MediQ */
#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(8,185,176,.30) !important;
border-radius: 8px !important;
background: #effaf9 !important;
color: #078d87 !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: #dff7f4 !important;
border-color: rgba(8,185,176,.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(8,185,176,.65);
box-shadow: 0 0 0 3px rgba(8,185,176,.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 #dce9ef !important;
}
#mediq-dashboard .mq-edit-host th {
padding: 12px 14px !important;
text-align: right !important;
background: #f3f8fa !important;
color: #47677d !important;
border-bottom: 1px solid #dce9ef !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 #edf3f6 !important;
font-size: 12px !important;
font-weight: 700 !important;
}
/* Keep ConfiForms/AUI edit dialogs above the full-screen MediQ shell */
.aui-blanket {
z-index: 10060 !important;
}
.aui-dialog,
.aui-dialog2,
.aui-dialog2[open],
.aui-dialog2[aria-hidden="false"] {
z-index: 10070 !important;
}
/* ============================================================
MEDIQ - SECTIONED CONFIFORMS + MODEL QUICK CREATE
============================================================ */
#mqCfDialog { width:min(780px,96vw); }
#mqModelModal {
position:fixed; inset:0; z-index:10080; display:none;
align-items:center; justify-content:center; padding:24px;
background:rgba(3,35,55,.58); backdrop-filter:blur(4px); direction:rtl;
}
#mqModelModal.open { display:flex; }
#mqModelDialog {
width:min(800px,96vw); max-height:90vh; overflow:auto;
background:#fff; border:1px solid #dce9ef; border-radius:20px;
box-shadow:0 30px 90px rgba(3,35,55,.28);
}
#mqModelHeader {
display:flex; align-items:center; justify-content:space-between; gap:16px;
padding:18px 22px; border-bottom:1px solid #e4eef2;
}
#mqModelHeader strong { color:#073553; font-size:16px; font-weight:900; }
#mqModelClose {
width:34px; height:34px; border:0; border-radius:9px;
background:#f1f6f8; color:#557287; font:700 20px/34px Tahoma,Arial,sans-serif; cursor:pointer;
}
#mqModelClose:hover { background:#e6f4f4; color:#069e98; }
#mqModelBody { padding:8px 18px 18px; }
#mqModelBody .confiFormsFormBorder {
width:100%!important; margin:0!important; border:0!important; box-shadow:none!important;
}
#mqModelBody .confiFormsFormTitle { display:none!important; }
#mqModelBody .confiFormsFormContent { padding:16px 4px!important; }
#mqModelBody .confiFormsFormFooter { padding:14px 4px 4px!important; background:transparent!important; }
#mqModelBody table { width:100%!important; }
#mqModelBody td { border:0!important; padding:8px!important; text-align:right!important; }
#mqModelBody input[type="text"],
#mqModelBody input[type="password"],
#mqModelBody textarea,
#mqModelBody select {
width:100%!important; max-width:none!important; min-width:0!important;
min-height:40px; border-radius:9px!important; direction:rtl;
}
#mqModelBody .save-cf-btn {
min-width:130px; min-height:40px; border:0!important; border-radius:9px!important;
background:linear-gradient(90deg,#08aaa4,#0bc1b8)!important;
color:#fff!important; font-family:inherit!important; font-weight:800!important; cursor:pointer;
}
#mqCfBody .mq-form-section-row td,
#mqModelBody .mq-form-section-row td {
padding:15px 8px 7px!important;
}
#mqCfBody .mq-form-section-title,
#mqModelBody .mq-form-section-title {
display:flex; align-items:center; gap:9px; color:#073553;
font-size:13px; font-weight:900; padding-bottom:8px;
border-bottom:1px solid #e5eef2;
}
#mqCfBody .mq-form-section-title::before,
#mqModelBody .mq-form-section-title::before {
content:""; width:7px; height:7px; border-radius:50%; background:#08b9b0;
box-shadow:0 0 0 4px rgba(8,185,176,.10);
}
#mqCfBody tr.mq-system-field,
#mqModelBody tr.mq-system-field { display:none!important; }
/* =====================================================
MODEL FIELD + ADD MODEL BUTTON
===================================================== */
.mq-model-field-cell{
white-space:normal!important;
width:100%!important;
}
.mq-device-model-wrap{
display:flex!important;
flex-direction:row!important;
align-items:center!important;
justify-content:flex-start!important;
gap:10px!important;
width:100%!important;
min-width:0!important;
direction:ltr!important;
}
.mq-device-model-wrap > .select2-container,
.mq-device-model-wrap > select,
.mq-device-model-wrap > input{
flex:1 1 auto!important;
width:calc(100% - 50px)!important;
max-width:calc(100% - 50px)!important;
min-width:0!important;
margin:0!important;
}
/* Select2 / Insight visible box */
.mq-device-model-wrap .select2-choice,
.mq-device-model-wrap .select2-selection,
.mq-device-model-wrap .aui-select2-choice{
min-height:40px!important;
height:40px!important;
border:1px solid #d5e3ea!important;
border-radius:10px!important;
background:#f9fbfc!important;
box-shadow:none!important;
color:#173b59!important;
overflow:hidden!important;
}
.mq-device-model-wrap .select2-chosen,
.mq-device-model-wrap .select2-selection__rendered{
display:block!important;
max-width:100%!important;
line-height:38px!important;
padding:0 34px 0 14px!important;
color:#173b59!important;
font-size:12px!important;
font-weight:700!important;
white-space:nowrap!important;
overflow:hidden!important;
text-overflow:ellipsis!important;
direction:rtl!important;
text-align:right!important;
}
.mq-device-model-wrap .select2-arrow,
.mq-device-model-wrap .select2-selection__arrow{
height:38px!important;
top:0!important;
right:4px!important;
border:0!important;
background:transparent!important;
}
.mq-device-model-wrap .select2-search-choice-close,
.mq-device-model-wrap .select2-selection__clear,
.mq-device-model-wrap .select2-clear{
left:10px!important;
right:auto!important;
top:50%!important;
transform:translateY(-50%)!important;
margin:0!important;
}
.mq-model-plus{
flex:0 0 40px!important;
width:40px!important;
height:40px!important;
min-width:40px!important;
margin:0!important;
padding:0!important;
border:1px solid #8fded8!important;
border-radius:11px!important;
background:#eafaf8!important;
color:#078f89!important;
font:900 22px/38px Tahoma,Arial,sans-serif!important;
cursor:pointer!important;
text-align:center!important;
box-shadow:none!important;
transition:.18s ease!important;
}
.mq-model-plus:hover{
background:#08b9b0!important;
border-color:#08b9b0!important;
color:#fff!important;
transform:translateY(-1px);
}
.mq-model-plus:focus{
outline:none!important;
box-shadow:0 0 0 4px rgba(8,185,176,.14)!important;
}
/* Keep Select2 / AUI dropdowns above both MediQ modals while open. */
.select2-drop,
.select2-dropdown,
.aui-select2-drop { z-index:10120!important; }
/* ============================================================
FIX CONFIFORMS / SELECT2 ORIGINAL HIDDEN FIELDS
جلوگیری از نمایش نوار خاکستری زیر Select2
============================================================ */
#mqCfBody select.select2-offscreen,
#mqCfBody input.select2-offscreen,
#mqCfBody select.select2-hidden-accessible,
#mqCfBody input.select2-hidden-accessible,
#mqModelBody select.select2-offscreen,
#mqModelBody input.select2-offscreen,
#mqModelBody select.select2-hidden-accessible,
#mqModelBody input.select2-hidden-accessible{
position:absolute !important;
left:-10000px !important;
top:auto !important;
width:1px !important;
height:1px !important;
min-width:1px !important;
max-width:1px !important;
padding:0 !important;
margin:0 !important;
border:0 !important;
opacity:0 !important;
overflow:hidden !important;
pointer-events:none !important;
}
/* فقط Select2 قابل مشاهده عرض بگیرد */
.mq-device-model-wrap > .select2-container{
flex:1 1 auto !important;
width:calc(100% - 50px) !important;
max-width:calc(100% - 50px) !important;
min-width:0 !important;
margin:0 !important;
}
/* خود Select مخفی Select2 نباید Flex شود */
.mq-device-model-wrap > select.select2-offscreen,
.mq-device-model-wrap > input.select2-offscreen,
.mq-device-model-wrap > select.select2-hidden-accessible,
.mq-device-model-wrap > input.select2-hidden-accessible{
flex:none !important;
}
/* وضعیت و سایر Select2های فرم نیز فقط کنترل ظاهری را نشان بدهند */
#mqCfBody .select2-container,
#mqModelBody .select2-container{
position:relative !important;
display:inline-block !important;
vertical-align:middle !important;
}
/* جلوگیری از ایجاد پسزمینه خاکستری اضافه برای کنترل اصلی */
#mqCfBody select[style*="display: none"],
#mqModelBody select[style*="display: none"]{
width:1px !important;
min-width:1px !important;
max-width:1px !important;
height:1px !important;
margin:0 !important;
padding:0 !important;
}
/* ============================================================
MEDIQ V25 - CONFIFORMS AJAX SAFE MODAL
فرم واقعی ConfiForms هرگز از محل اصلی DOM جابهجا نمیشود.
============================================================ */
/* Our old custom dialog is now only a backdrop container. */
#mqCfModal,
#mqModelModal{
background:rgba(3,35,55,.50) !important;
backdrop-filter:blur(3px);
}
#mqCfDialog,
#mqModelDialog{
display:none !important;
}
/* Keep source forms out of the normal page layout while closed. */
body:not(.mq-asset-form-open) .cf_mediqNewAsset,
body:not(.mq-model-form-open) .cf_mediqNewModel{
position:fixed !important;
left:-200vw !important;
top:0 !important;
width:1px !important;
height:1px !important;
max-height:1px !important;
overflow:hidden !important;
opacity:0 !important;
visibility:hidden !important;
pointer-events:none !important;
margin:0 !important;
}
/* REAL ASSET FORM = modal */
body.mq-asset-form-open .cf_mediqNewAsset{
display:block !important;
position:fixed !important;
z-index:10070 !important;
left:50% !important;
top:50% !important;
transform:translate(-50%,-50%) !important;
width:min(760px,94vw) !important;
max-width:94vw !important;
height:auto !important;
max-height:88vh !important;
overflow-y:auto !important;
overflow-x:hidden !important;
margin:0 !important;
padding:0 !important;
opacity:1 !important;
visibility:visible !important;
pointer-events:auto !important;
background:#fff !important;
border:1px solid #dce9ef !important;
border-radius:20px !important;
box-shadow:0 28px 80px rgba(3,35,55,.28) !important;
direction:rtl !important;
}
/* REAL MODEL FORM = modal */
body.mq-model-form-open .cf_mediqNewModel{
display:block !important;
position:fixed !important;
z-index:10110 !important;
left:50% !important;
top:50% !important;
transform:translate(-50%,-50%) !important;
width:min(700px,94vw) !important;
max-width:94vw !important;
height:auto !important;
max-height:86vh !important;
overflow-y:auto !important;
overflow-x:hidden !important;
margin:0 !important;
padding:0 !important;
opacity:1 !important;
visibility:visible !important;
pointer-events:auto !important;
background:#fff !important;
border:1px solid #dce9ef !important;
border-radius:20px !important;
box-shadow:0 28px 80px rgba(3,35,55,.30) !important;
direction:rtl !important;
}
/* Inner ConfiForms wrappers must not create nested scrollbars. */
body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormContent,
body.mq-asset-form-open .cf_mediqNewAsset form.aui-confiforms,
body.mq-asset-form-open .cf_mediqNewAsset .table-wrap,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormContent,
body.mq-model-form-open .cf_mediqNewModel form.aui-confiforms,
body.mq-model-form-open .cf_mediqNewModel .table-wrap{
overflow:visible !important;
overflow-x:visible !important;
overflow-y:visible !important;
height:auto !important;
max-height:none !important;
max-width:100% !important;
box-sizing:border-box !important;
}
/* Header from ConfiForms itself */
body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormTitle,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormTitle{
display:flex !important;
align-items:center !important;
justify-content:space-between !important;
gap:12px !important;
position:sticky !important;
top:0 !important;
z-index:20 !important;
margin:0 !important;
padding:17px 20px !important;
background:#fff !important;
border-bottom:1px solid #e4eef2 !important;
}
body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormTitle h1,
body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormTitle h2,
body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormTitle h3,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormTitle h1,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormTitle h2,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormTitle h3{
margin:0 !important;
padding:0 !important;
font-size:16px !important;
line-height:1.6 !important;
font-weight:900 !important;
color:#073553 !important;
}
/* Close button injected into the real form title */
.mq-native-form-close{
flex:0 0 34px !important;
width:34px !important;
height:34px !important;
padding:0 !important;
margin:0 !important;
border:0 !important;
border-radius:9px !important;
background:#f1f6f8 !important;
color:#557287 !important;
font:700 20px/34px Tahoma,Arial,sans-serif !important;
cursor:pointer !important;
text-align:center !important;
}
.mq-native-form-close:hover{
background:#e6f4f4 !important;
color:#069e98 !important;
}
/* Normal form spacing */
body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormContent,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormContent{
padding:14px 18px 18px !important;
}
body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormFooter,
body.mq-model-form-open .cf_mediqNewModel .confiFormsFormFooter{
background:#fff !important;
padding:12px 18px 18px !important;
}
/* Avoid horizontal overflow */
body.mq-asset-form-open .cf_mediqNewAsset table,
body.mq-model-form-open .cf_mediqNewModel table{
width:100% !important;
max-width:100% !important;
box-sizing:border-box !important;
}
body.mq-asset-form-open .cf_mediqNewAsset td,
body.mq-asset-form-open .cf_mediqNewAsset th,
body.mq-model-form-open .cf_mediqNewModel td,
body.mq-model-form-open .cf_mediqNewModel th{
box-sizing:border-box !important;
max-width:100% !important;
}
/* Select2 dropdowns are usually appended directly to body. */
body.mq-asset-form-open .select2-drop,
body.mq-asset-form-open .aui-select2-drop,
body.mq-asset-form-open .select2-dropdown{
z-index:10095 !important;
}
body.mq-model-form-open .select2-drop,
body.mq-model-form-open .aui-select2-drop,
body.mq-model-form-open .select2-dropdown{
z-index:10130 !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=174855144"
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>
</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 NAVIGATION TREE -->
<div class="mq-tree-title">ساختار تأمین</div>
<div class="mq-tree" id="mqTree">
<div class="mq-tree-row level-1 active" data-tree-action="equipment" data-tree-key="equipment">
<span class="mq-tree-dot"></span>
<span>مدیریت تجهیزات</span>
<span class="mq-tree-arrow">‹</span>
</div>
<div class="mq-tree-children open" data-tree-group="equipment">
<div class="mq-tree-row level-2" data-tree-action="property" data-tree-key="property">
<span class="mq-tree-dot"></span>
<span>مدیریت اموال</span>
</div>
<div class="mq-tree-row level-2" data-tree-action="equipmentMaintenance" data-tree-key="equipmentMaintenance">
<span class="mq-tree-dot"></span>
<span>مدیریت نگهداری و تعمیر</span>
</div>
<div class="mq-tree-row level-2" data-tree-action="finance" data-tree-key="finance">
<span class="mq-tree-dot"></span>
<span>مدیریت مالی و بهرهوری</span>
</div>
<div class="mq-tree-row level-2" data-tree-action="logistics" data-tree-key="logistics">
<span class="mq-tree-dot"></span>
<span>مدیریت تأمین و لجستیک</span>
<span class="mq-tree-arrow">‹</span>
</div>
<div class="mq-tree-children" data-tree-group="logistics">
<div class="mq-tree-row level-3" data-tree-action="purchase" data-tree-key="purchase">
<span class="mq-tree-dot"></span>
<span>خرید دارایی</span>
</div>
<div class="mq-tree-row level-3" data-tree-action="newAsset" data-tree-key="newAsset">
<span class="mq-tree-dot"></span>
<span>ورود دارایی جدید</span>
<span class="mq-tree-arrow">‹</span>
</div>
<div class="mq-tree-children" data-tree-group="newAsset">
<div class="mq-tree-row level-4" data-tree-action="section" data-mode="newAsset" data-section="purchased" data-tree-key="newAsset-purchased"><span class="mq-tree-dot"></span><span>لیست داراییها</span></div>
<div class="mq-tree-row level-4" data-tree-action="section" data-mode="newAsset" data-section="technical" data-tree-key="newAsset-technical"><span class="mq-tree-dot"></span><span>شناسنامه فنی</span></div>
<div class="mq-tree-row level-4" data-tree-action="section" data-mode="newAsset" data-section="financial" data-tree-key="newAsset-financial"><span class="mq-tree-dot"></span><span>شناسنامه مالی</span></div>
<div class="mq-tree-row level-4" data-tree-action="section" data-mode="newAsset" data-section="maintenance" data-tree-key="newAsset-maintenance"><span class="mq-tree-dot"></span><span>شناسنامه نگهداری و تعمیر</span></div>
<div class="mq-tree-row level-4" data-tree-action="section" data-mode="newAsset" data-section="commercial" data-tree-key="newAsset-commercial"><span class="mq-tree-dot"></span><span>شناسنامه بازرگانی</span></div>
</div>
<div class="mq-tree-row level-3" data-tree-action="editAsset" data-tree-key="editAsset">
<span class="mq-tree-dot"></span>
<span>ویرایش دارایی</span>
<span class="mq-tree-arrow">‹</span>
</div>
<div class="mq-tree-children" data-tree-group="editAsset">
<div class="mq-tree-row level-4" data-tree-action="section" data-mode="editAsset" data-section="purchased" data-tree-key="editAsset-purchased"><span class="mq-tree-dot"></span><span>لیست داراییها</span></div>
<div class="mq-tree-row level-4" data-tree-action="section" data-mode="editAsset" data-section="technical" data-tree-key="editAsset-technical"><span class="mq-tree-dot"></span><span>شناسنامه فنی</span></div>
<div class="mq-tree-row level-4" data-tree-action="section" data-mode="editAsset" data-section="financial" data-tree-key="editAsset-financial"><span class="mq-tree-dot"></span><span>شناسنامه مالی</span></div>
<div class="mq-tree-row level-4" data-tree-action="section" data-mode="editAsset" data-section="maintenance" data-tree-key="editAsset-maintenance"><span class="mq-tree-dot"></span><span>شناسنامه نگهداری و تعمیر</span></div>
<div class="mq-tree-row level-4" data-tree-action="section" data-mode="editAsset" data-section="commercial" data-tree-key="editAsset-commercial"><span class="mq-tree-dot"></span><span>شناسنامه بازرگانی</span></div>
</div>
<div class="mq-tree-row level-3" data-tree-action="consumable" data-tree-key="consumable">
<span class="mq-tree-dot"></span>
<span>کالاهای مصرفی</span>
</div>
</div>
</div>
<div class="mq-tree-separator"></div>
<div class="mq-tree-row level-1" data-tree-action="cycle" data-cycle="operation" data-tree-key="operation">
<span class="mq-tree-dot"></span><span>بهرهبرداری</span>
</div>
<div class="mq-tree-row level-1" data-tree-action="cycle" data-cycle="replacement" data-tree-key="replacement">
<span class="mq-tree-dot"></span><span>جایگزینی</span>
</div>
<div class="mq-tree-row level-1" data-tree-action="cycle" data-cycle="maintenance" data-tree-key="maintenanceCycle">
<span class="mq-tree-dot"></span><span>نگهداری</span>
</div>
</div>
<div class="mq-sidebar-bottom">
<div
id="mqLogout"
class="mq-logout"
>
خروج از حساب کاربری
</div>
</div>
</aside>
</div>
<!-- MEDIQ CONFIFORMS MODAL -->
<div id="mqCfModal" aria-hidden="true">
<div id="mqCfDialog" role="dialog" aria-modal="true" aria-labelledby="mqCfTitle">
<div id="mqCfHeader">
<strong id="mqCfTitle">ثبت دارایی جدید</strong>
<button id="mqCfClose" type="button" aria-label="بستن">×</button>
</div>
<div id="mqCfBody"></div>
</div>
</div>
<!-- MEDIQ NEW MODEL MODAL -->
<div id="mqModelModal" aria-hidden="true">
<div id="mqModelDialog" role="dialog" aria-modal="true" aria-labelledby="mqModelTitle">
<div id="mqModelHeader">
<strong id="mqModelTitle">ثبت مدل جدید</strong>
<button id="mqModelClose" type="button" aria-label="بستن">×</button>
</div>
<div id="mqModelBody"></div>
</div>
</div>
<div
id="mqToast"
class="mq-toast"
></div>
<script>
(function () {
"use strict";
/* ============================================================
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 = {
property:
'<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>',
maintenance:
'<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>',
finance:
'<circle cx="12" cy="12" r="9"></circle>' +
'<path d="M8 12h8"></path>' +
'<path d="M12 8v8"></path>',
supply:
'<path d="M4 7h16"></path>' +
'<path d="M6 7l1 13h10l1-13"></path>' +
'<path d="M9 4h6"></path>',
purchase:
'<path d="M4 5h2l2 11h9l2-7H8"></path>' +
'<circle cx="10" cy="20" r="1"></circle>' +
'<circle cx="17" cy="20" r="1"></circle>',
newAsset:
'<path d="M12 3l7 4-7 4-7-4 7-4z"></path>' +
'<path d="M5 7v9l7 4 7-4V7"></path>' +
'<path d="M18 3v6"></path>' +
'<path d="M15 6h6"></path>',
edit:
'<path d="M4 20h4l11-11-4-4L4 16v4z"></path>' +
'<path d="M13 7l4 4"></path>',
consumable:
'<rect x="5" y="4" width="14" height="16" rx="2"></rect>' +
'<path d="M8 9h8"></path>' +
'<path d="M8 13h8"></path>'
};
/* ============================================================
TOAST
============================================================ */
var toastTimer = null;
function showToast(message) {
if (!toast) {
return;
}
toast.textContent =
message;
toast.classList.add(
"show"
);
window.clearTimeout(
toastTimer
);
toastTimer =
window.setTimeout(
function () {
toast.classList.remove(
"show"
);
},
2200
);
}
/* ============================================================
BREADCRUMB
============================================================ */
function buildBreadcrumb(items) {
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.property,
"",
false
) +
moduleCard(
"مدیریت نگهداری و تعمیر",
ICONS.maintenance,
"",
false
) +
moduleCard(
"مدیریت مالی و بهرهوری",
ICONS.finance,
"",
false
) +
moduleCard(
"مدیریت تأمین و لجستیک",
ICONS.supply,
"logistics",
true
) +
'</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:
"شناسنامه بازرگانی"
};
function mqFindConfiFormsTable() {
var tables = document.querySelectorAll("table");
var bestTable = null;
var bestScore = -99999;
function norm(value) {
return String(value || "")
.replace(/\s+/g, " ")
.trim()
.toLowerCase();
}
function isCalendarTable(table, txt, raw) {
var marker = norm(
(table.id || "") + " " +
(table.className || "") + " " +
raw
);
if (
marker.indexOf("datepicker") >= 0 ||
marker.indexOf("date-picker") >= 0 ||
marker.indexOf("calendar") >= 0 ||
marker.indexOf("ui-datepicker") >= 0 ||
marker.indexOf("aui-datepicker") >= 0
) {
return true;
}
var days = ["sun","mon","tue","wed","thu","fri","sat"];
var hits = 0;
for (var d = 0; d < days.length; d++) {
if (txt.indexOf(days[d]) >= 0) hits++;
}
return hits >= 4;
}
for (var i = 0; i < tables.length; i++) {
var table = tables[i];
/* Never clone tables that belong to MediQ itself or to a registration form. */
if (table.closest("#mediq-dashboard")) continue;
if (table.closest("#mqCfModal")) continue;
if (table.closest("#mqModelModal")) continue;
if (table.closest("form.aui-confiforms")) continue;
if (table.closest(".confiFormsFormBorder")) continue;
var txt = norm(table.textContent);
var raw = "";
try { raw = norm(table.outerHTML); } catch (e) {}
/* IMPORTANT: purchaseDate calendar must NEVER be considered the asset list. */
if (isCalendarTable(table, txt, raw)) continue;
var rows = table.querySelectorAll("tr");
var cells = table.querySelectorAll("td,th");
if (rows.length < 2 || cells.length < 2) continue;
var score = 0;
if (txt.indexOf("شناسه دستگاه") >= 0) score += 180;
if (txt.indexOf("نام دستگاه") >= 0) score += 180;
if (txt.indexOf("مدل دستگاه") >= 0) score += 80;
if (txt.indexOf("delete") >= 0 || txt.indexOf("حذف") >= 0) score += 110;
if (txt.indexOf("edit") >= 0 || txt.indexOf("ویرایش") >= 0) score += 40;
/* ConfiForms wrapper/class/id evidence. */
var ancestors = table;
for (var p = 0; p < 5 && ancestors; p++, ancestors = ancestors.parentElement) {
var a = norm(
(ancestors.id || "") + " " +
(ancestors.className || "") + " " +
(ancestors.getAttribute && ancestors.getAttribute("data-form-name") || "")
);
if (a.indexOf("confiform") >= 0) score += 50;
if (a.indexOf("mediqnewasset") >= 0) score += 140;
}
/* Data-looking rows also help when ConfiForms doesn't render headers. */
if (rows.length >= 2) score += Math.min(rows.length, 10) * 3;
if (score > bestScore) {
bestScore = score;
bestTable = table;
}
}
/* We need positive evidence; don't ever fall back to an arbitrary page table. */
return bestScore >= 90 ? bestTable : null;
}
function mqFindDeleteControl(row) {
if (!row) return null;
var candidates = row.querySelectorAll('a, button, input[type="button"], input[type="submit"]');
for (var i = 0; i < candidates.length; i++) {
var el = candidates[i];
var text = ((el.textContent || el.value || '') + '').trim().toLowerCase();
var cls = ((el.className || '') + '').toLowerCase();
var title = ((el.getAttribute('title') || '') + '').toLowerCase();
if (text === 'delete' || text === 'حذف' || cls.indexOf('delete') >= 0 || title.indexOf('delete') >= 0) {
return el;
}
}
return null;
}
function mqFindEditControl(row) {
if (!row) return null;
var candidates = row.querySelectorAll('a, button, input[type="button"], input[type="submit"]');
for (var i = 0; i < candidates.length; i++) {
var el = candidates[i];
var text = ((el.textContent || el.value || '') + '').trim().toLowerCase();
var cls = ((el.className || '') + '').toLowerCase();
var title = ((el.getAttribute('title') || '') + '').toLowerCase();
if (text === 'edit' || text === 'ویرایش' || cls.indexOf('edit') >= 0 || title.indexOf('edit') >= 0) {
return el;
}
}
return null;
}
function mqExtractEntryId(deleteControl, row) {
function fromElement(el) {
if (!el) return "";
var directNames = [
"data-entry-id",
"data-entryid",
"data-entry",
"entryid",
"data-id"
];
for (var i = 0; i < directNames.length; i++) {
var v = el.getAttribute && el.getAttribute(directNames[i]);
if (v && /^[A-Za-z0-9_-]+$/.test(v)) return v;
}
var hidden = el.querySelector && el.querySelector('input[name="entryId"],input[name="entryid"]');
if (hidden && hidden.value) return hidden.value;
var raw = "";
try {
raw += " " + (el.getAttribute("href") || "");
raw += " " + (el.getAttribute("onclick") || "");
raw += " " + (el.outerHTML || "");
} catch (ignore) {}
try { raw = decodeURIComponent(raw); } catch (ignore2) {}
var match = raw.match(/entryId\s*[=:]\s*["']?([A-Za-z0-9_-]+)/i) ||
raw.match(/[?&]entryId=([^&"'<>\s]+)/i);
if (match && match[1]) return match[1];
var uuid = raw.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i);
return uuid ? uuid[0] : "";
}
return fromElement(deleteControl) || fromElement(row);
}
function mqDeleteConfiFormsEntry(entryId, sourceRow, clonedRow) {
if (!entryId) {
showToast("شناسه رکورد ConfiForms پیدا نشد.");
return;
}
if (!window.confirm("این رکورد حذف شود؟")) return;
var pageId = "174855144";
var formName = "mediqNewAsset";
/* ConfiForms REST API v1 - Delete entry by ID */
var url =
"/rest/confiforms/1.0/deleteById/" +
encodeURIComponent(pageId) + "/" +
encodeURIComponent(formName) + "/" +
encodeURIComponent(entryId) +
"?skipIFTTTExecute=true";
var xhr = new XMLHttpRequest();
xhr.open("DELETE", url, true);
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader("X-Atlassian-Token", "no-check");
xhr.onreadystatechange = function () {
if (xhr.readyState !== 4) return;
if (xhr.status >= 200 && xhr.status < 300) {
if (sourceRow && sourceRow.parentNode) sourceRow.parentNode.removeChild(sourceRow);
if (clonedRow && clonedRow.parentNode) clonedRow.parentNode.removeChild(clonedRow);
showToast("رکورد با موفقیت حذف شد.");
return;
}
if (xhr.status === 401 || xhr.status === 403) {
showToast("اجازه حذف این رکورد را ندارید.");
return;
}
if (xhr.status === 404) {
showToast("رکورد یا API حذف ConfiForms پیدا نشد (404).");
return;
}
var details = "";
try {
details = (xhr.responseText || "").replace(/\s+/g, " ").trim();
if (details.length > 140) details = details.substring(0, 140) + "...";
} catch (ignore) {}
showToast(
"حذف انجام نشد. کد خطا: " + xhr.status +
(details ? " - " + details : "")
);
};
xhr.onerror = function () {
showToast("ارتباط با ConfiForms برای حذف رکورد برقرار نشد.");
};
xhr.send(null);
}
function mqBindClonedEditControls(sourceTable, clonedTable) {
var sourceRows = sourceTable.querySelectorAll('tr');
var clonedRows = clonedTable.querySelectorAll('tr');
for (var i = 0; i < clonedRows.length; i++) {
var clonedEdit = mqFindEditControl(clonedRows[i]);
if (!clonedEdit) continue;
var sourceRow = i < sourceRows.length ? sourceRows[i] : null;
var sourceEdit = sourceRow ? mqFindEditControl(sourceRow) : null;
clonedEdit.textContent = 'ویرایش';
if ('value' in clonedEdit && clonedEdit.tagName !== 'A') clonedEdit.value = 'ویرایش';
clonedEdit.setAttribute('title', 'ویرایش دارایی');
clonedEdit.classList.add('mq-cf-edit-proxy');
clonedEdit.setAttribute('href', '#');
if (!sourceEdit) {
clonedEdit.style.display = 'none';
continue;
}
(function (btn, srcEdit) {
btn.onclick = function (e) {
e.preventDefault();
e.stopPropagation();
try {
try {
window.sessionStorage.setItem('mediqPendingReturn', 'editAsset');
} catch (ignore) {}
srcEdit.click();
} catch (err) {
showToast('فرم ویرایش ConfiForms باز نشد.');
}
return false;
};
})(clonedEdit, sourceEdit);
}
}
function mqBindClonedDeleteControls(sourceTable, clonedTable) {
var sourceRows = sourceTable.querySelectorAll('tr');
var clonedRows = clonedTable.querySelectorAll('tr');
for (var i = 0; i < clonedRows.length; i++) {
var clonedDelete = mqFindDeleteControl(clonedRows[i]);
if (!clonedDelete) continue;
var sourceRow = i < sourceRows.length ? sourceRows[i] : null;
var sourceDelete = sourceRow ? mqFindDeleteControl(sourceRow) : null;
clonedDelete.textContent = 'حذف';
if ('value' in clonedDelete && clonedDelete.tagName !== 'A') clonedDelete.value = 'حذف';
clonedDelete.setAttribute('title', 'حذف رکورد');
clonedDelete.classList.add('mq-cf-delete-proxy');
clonedDelete.setAttribute('href', '#');
if (!sourceDelete) {
clonedDelete.style.display = 'none';
continue;
}
(function (btn, srcDelete, srcRow, visualRow) {
btn.onclick = function (e) {
e.preventDefault();
e.stopPropagation();
var entryId = mqExtractEntryId(srcDelete, srcRow);
mqDeleteConfiFormsEntry(entryId, srcRow, visualRow);
return false;
};
})(clonedDelete, sourceDelete, sourceRow, clonedRows[i]);
}
}
function mqLoadPurchasedAssets(attempt) {
var host = document.getElementById("mqAssetsHost");
if (!host) return;
var table = mqFindConfiFormsTable();
if (!table) {
if ((attempt || 0) < 12) {
window.setTimeout(function () {
mqLoadPurchasedAssets((attempt || 0) + 1);
}, 250);
return;
}
host.innerHTML =
'<div class="mq-assets-message">' +
'خروجی لیست ConfiForms روی صفحه پیدا نشد.' +
'</div>';
return;
}
var clonedTable = table.cloneNode(true);
/* Remove only form/edit inputs from the visual copy; keep Delete and proxy it to the real ConfiForms control */
var controls = clonedTable.querySelectorAll('input:not([type="button"]):not([type="submit"]), select, textarea');
for (var i = 0; i < controls.length; i++) {
controls[i].parentNode && controls[i].parentNode.removeChild(controls[i]);
}
/* Creation/list screen: editing is intentionally kept out of this screen. */
var clonedEdits = clonedTable.querySelectorAll('a, button, input[type="button"], input[type="submit"]');
for (var e = clonedEdits.length - 1; e >= 0; e--) {
var candidate = clonedEdits[e];
var txt = ((candidate.textContent || candidate.value || '') + '').trim().toLowerCase();
var cls = ((candidate.className || '') + '').toLowerCase();
var ttl = ((candidate.getAttribute('title') || '') + '').toLowerCase();
if (txt === 'edit' || txt === 'ویرایش' || cls.indexOf('edit') >= 0 || ttl.indexOf('edit') >= 0) {
candidate.parentNode && candidate.parentNode.removeChild(candidate);
}
}
mqBindClonedDeleteControls(table, clonedTable);
host.innerHTML = "";
host.appendChild(clonedTable);
}
function mqRenderPurchasedAssets(container) {
container.innerHTML =
'<div class="mq-preview-title">لیست داراییها</div>' +
'<div class="mq-preview-description">داراییهای ثبتشده</div>' +
'<div class="mq-assets-head">' +
'<div></div>' +
'<div class="mq-assets-actions">' +
'<button class="mq-assets-btn" type="button" id="mqAssetsRefresh">بهروزرسانی لیست</button>' +
'<button class="mq-assets-btn primary" type="button" id="mqAssetsNew">ثبت دارایی جدید</button>' +
'</div>' +
'</div>' +
'<div id="mqAssetsHost" class="mq-assets-host">' +
'<div class="mq-assets-message">در حال بارگذاری داراییها...</div>' +
'</div>';
var addButton = document.getElementById("mqAssetsNew");
if (addButton) addButton.onclick = openMediQAssetForm;
var refreshButton = document.getElementById("mqAssetsRefresh");
if (refreshButton) {
refreshButton.onclick = function () {
try {
window.sessionStorage.setItem("mediqResumeView", "newAsset-purchased");
} catch (e) {}
window.location.reload();
};
}
mqLoadPurchasedAssets(0);
}
function mqLoadEditAssets(attempt) {
var host = document.getElementById("mqEditAssetsHost");
if (!host) return;
var table = mqFindConfiFormsTable();
if (!table) {
if ((attempt || 0) < 12) {
window.setTimeout(function () {
mqLoadEditAssets((attempt || 0) + 1);
}, 250);
return;
}
host.innerHTML =
'<div class="mq-assets-message">' +
'خروجی لیست ConfiForms روی صفحه پیدا نشد.' +
'</div>';
return;
}
var clonedTable = table.cloneNode(true);
var inputs = clonedTable.querySelectorAll('input:not([type="button"]):not([type="submit"]), select, textarea');
for (var i = 0; i < inputs.length; i++) {
inputs[i].parentNode && inputs[i].parentNode.removeChild(inputs[i]);
}
/* Edit screen: only Edit is exposed; Delete stays in the registration/list screen. */
var buttons = clonedTable.querySelectorAll('a, button, input[type="button"], input[type="submit"]');
for (var x = buttons.length - 1; x >= 0; x--) {
var btn = buttons[x];
var text = ((btn.textContent || btn.value || '') + '').trim().toLowerCase();
var cls = ((btn.className || '') + '').toLowerCase();
var title = ((btn.getAttribute('title') || '') + '').toLowerCase();
if (text === 'delete' || text === 'حذف' || cls.indexOf('delete') >= 0 || title.indexOf('delete') >= 0) {
btn.parentNode && btn.parentNode.removeChild(btn);
}
}
mqBindClonedEditControls(table, clonedTable);
host.innerHTML = "";
host.appendChild(clonedTable);
var search = document.getElementById("mqEditSearch");
if (search) {
search.oninput = function () {
var q = (this.value || '').trim().toLowerCase();
var rows = clonedTable.querySelectorAll('tr');
for (var r = 1; r < rows.length; r++) {
var rowText = (rows[r].textContent || '').toLowerCase();
rows[r].style.display = (!q || rowText.indexOf(q) >= 0) ? '' : 'none';
}
};
}
}
function renderEditAssetWorkspace() {
state.screen = "editAsset";
pageTitle.textContent = "تأمین";
pageDesc.textContent = "مدیریت فرآیند تأمین تجهیزات پزشکی";
heroTitle.textContent = "ویرایش دارایی";
heroDesc.textContent = "دارایی موردنظر را انتخاب و اطلاعات آن را ویرایش کنید.";
backButton.style.display = "inline-block";
buildBreadcrumb([
"تأمین",
"مدیریت تجهیزات",
"مدیریت تأمین و لجستیک",
"ویرایش دارایی"
]);
view.innerHTML =
'<div class="mq-edit-wrap">' +
'<div class="mq-preview-title">ویرایش دارایی</div>' +
'<div class="mq-preview-description">دارایی را با نام یا شناسه جستجو کنید و روی «ویرایش» بزنید.</div>' +
'<div class="mq-edit-toolbar">' +
'<input id="mqEditSearch" class="mq-edit-search" type="text" placeholder="جستجو بر اساس شناسه یا نام دستگاه">' +
'</div>' +
'<div id="mqEditAssetsHost" class="mq-edit-host">' +
'<div class="mq-assets-message">در حال بارگذاری داراییها...</div>' +
'</div>' +
'</div>';
mqTreeActivate("editAsset");
mqLoadEditAssets(0);
}
function renderPreview(section) {
state.selectedAssetSection = section;
if (state.screen === "newAsset" || state.screen === "editAsset") {
mqTreeActivate(state.screen + "-" + section);
}
var container = document.getElementById("mqPreviewContent");
if (!container) return;
var title = SECTION_NAMES[section];
if (section === "purchased") {
mqRenderPurchasedAssets(container);
} else {
container.innerHTML =
'<div class="mq-preview-title">' + title + '</div>' +
'<div class="mq-preview-description">' +
(state.screen === "newAsset"
? "اطلاعات این بخش را برای دارایی انتخابشده تکمیل کنید."
: "اطلاعات این بخش را برای دارایی انتخابشده مشاهده یا ویرایش کنید.") +
'</div>' +
'<div class="mq-demo-box">' +
'<div class="mq-demo-icon">✓</div>' +
'<div class="mq-demo-text">' + title + '</div>' +
'<button class="mq-demo-button" type="button" id="mqDemoButton">' +
(state.screen === "newAsset" ? "ثبت اطلاعات" : "مشاهده اطلاعات") +
'</button>' +
'</div>';
}
var options = document.querySelectorAll("#mediq-dashboard .mq-list-option");
for (var i = 0; i < options.length; i++) {
options[i].classList.toggle(
"active",
options[i].getAttribute("data-section") === section
);
}
var demoButton = document.getElementById("mqDemoButton");
if (demoButton) {
demoButton.onclick = function () {
showToast("فرم این بخش هنوز تعریف نشده است.");
};
}
}
/* ============================================================
MEDIQ <-> CONFIFORMS : NEW ASSET FORM
============================================================ */
var mqCfOriginalParent = null;
var mqCfOriginalNext = null;
function mqFindConfiFormsRegistrationPanel(formName) {
if (!formName) return null;
var wanted = String(formName).toLowerCase();
function hasWantedValue(el) {
if (!el) return false;
var candidates = [
el.value,
el.getAttribute && el.getAttribute("value"),
el.getAttribute && el.getAttribute("data-form-name"),
el.getAttribute && el.getAttribute("data-formname"),
el.getAttribute && el.getAttribute("formname"),
el.getAttribute && el.getAttribute("data-form")
];
for (var i = 0; i < candidates.length; i++) {
if (
candidates[i] !== null &&
candidates[i] !== undefined &&
String(candidates[i]).trim().toLowerCase() === wanted
) {
return true;
}
}
return false;
}
function panelFromMarker(marker) {
if (!marker) return null;
return (
marker.closest(".confiFormsFormBorder") ||
marker.closest('[id^="i_confiform_registration_panel_"]') ||
marker.closest("form.aui-confiforms") ||
marker.closest("form") ||
marker.parentElement
);
}
/* --------------------------------------------------------
1) Hidden inputs used by different ConfiForms versions.
IMPORTANT: compare .value PROPERTY, not only [value=...]
because ConfiForms may set value dynamically.
-------------------------------------------------------- */
var markers = document.querySelectorAll(
'input#confiform_form_name,' +
'input[name="confiform_form_name"],' +
'input[name="registrationFormName"],' +
'input[name="formName"],' +
'input[id*="confiform_form_name"]'
);
for (var i = 0; i < markers.length; i++) {
if (hasWantedValue(markers[i])) {
var p1 = panelFromMarker(markers[i]);
if (p1) return p1;
}
}
/* --------------------------------------------------------
2) Known ConfiForms wrapper class:
cf_mediqNewAsset / cf_mediqNewModel
Compare case-insensitively because plugin markup may vary.
-------------------------------------------------------- */
var borders = document.querySelectorAll(".confiFormsFormBorder");
for (var j = 0; j < borders.length; j++) {
var cls = String(borders[j].className || "").toLowerCase();
if (
cls.indexOf("cf_" + wanted) !== -1 ||
cls.indexOf(wanted) !== -1
) {
return borders[j];
}
}
/* --------------------------------------------------------
3) Registration panel IDs created by ConfiForms.
Search the panel's form markup / hidden values.
-------------------------------------------------------- */
var registrationPanels = document.querySelectorAll(
'div[id^="i_confiform_registration_panel_"],' +
'[id*="confiform_registration_panel"]'
);
for (var k = 0; k < registrationPanels.length; k++) {
var rp = registrationPanels[k];
var innerMarkers = rp.querySelectorAll(
'input, form, [data-form-name], [data-formname], [formname]'
);
for (var m = 0; m < innerMarkers.length; m++) {
if (hasWantedValue(innerMarkers[m])) {
return (
rp.closest(".confiFormsFormBorder") ||
rp
);
}
}
var raw = "";
try {
raw = String(rp.outerHTML || "").toLowerCase();
} catch (ignoreRaw) {}
if (raw.indexOf(wanted) !== -1) {
return (
rp.closest(".confiFormsFormBorder") ||
rp
);
}
}
/* --------------------------------------------------------
4) Search actual ConfiForms registration forms.
-------------------------------------------------------- */
var cfForms = document.querySelectorAll(
'form.aui-confiforms,' +
'form[id^="i_confiform_registration_form_"],' +
'form[id*="confiform_registration_form"]'
);
for (var n = 0; n < cfForms.length; n++) {
var f = cfForms[n];
var fInputs = f.querySelectorAll("input");
for (var q = 0; q < fInputs.length; q++) {
if (hasWantedValue(fInputs[q])) {
return (
f.closest(".confiFormsFormBorder") ||
f.parentElement ||
f
);
}
}
var formRaw = "";
try {
formRaw = String(f.outerHTML || "").toLowerCase();
} catch (ignoreFormRaw) {}
if (formRaw.indexOf(wanted) !== -1) {
return (
f.closest(".confiFormsFormBorder") ||
f.parentElement ||
f
);
}
}
/* --------------------------------------------------------
5) Last-resort fallback for this dashboard.
The page has two Embedded registration forms:
mediqNewAsset first, mediqNewModel second.
Never use this if a named match above exists.
-------------------------------------------------------- */
var candidatePanels = [];
for (var z = 0; z < borders.length; z++) {
if (
borders[z].querySelector(
'form.aui-confiforms,' +
'form[id^="i_confiform_registration_form_"],' +
'form[id*="confiform_registration_form"]'
)
) {
candidatePanels.push(borders[z]);
}
}
if (candidatePanels.length) {
if (wanted === "mediqnewasset") {
return candidatePanels[0];
}
if (wanted === "mediqnewmodel" && candidatePanels.length > 1) {
return candidatePanels[1];
}
}
return null;
}
function mqFindConfiFormsPanelByFields(fieldNames, minMatches) {
if (!fieldNames || !fieldNames.length) return null;
minMatches = minMatches || fieldNames.length;
function scorePanel(panel) {
if (!panel) return 0;
var score = 0;
var raw = "";
try {
raw = String(panel.outerHTML || "").toLowerCase();
} catch (ignoreRaw) {}
for (var i = 0; i < fieldNames.length; i++) {
var fieldName = String(fieldNames[i] || "").trim();
if (!fieldName) continue;
var lower = fieldName.toLowerCase();
var found = false;
/*
* First try real controls. ConfiForms may prefix IDs,
* therefore check exact name plus partial id/name.
*/
try {
found = !!panel.querySelector(
'[name="' + fieldName + '"],' +
'[id="' + fieldName + '"],' +
'[id*="' + fieldName + '"],' +
'[name*="' + fieldName + '"]'
);
} catch (ignoreSelector) {}
/*
* Fallback to rendered markup. This catches Insight/Assets
* controls whose visible Select2 is generated from a hidden
* field.
*/
if (!found && raw.indexOf(lower) !== -1) {
found = true;
}
if (found) score++;
}
return score;
}
var candidates = [];
var seen = [];
function addCandidate(el) {
if (!el) return;
var panel =
el.closest && el.closest(".confiFormsFormBorder")
? el.closest(".confiFormsFormBorder")
: el;
if (!panel) return;
if (seen.indexOf(panel) !== -1) return;
seen.push(panel);
candidates.push(panel);
}
var borders = document.querySelectorAll(".confiFormsFormBorder");
for (var i = 0; i < borders.length; i++) {
addCandidate(borders[i]);
}
var registrationPanels = document.querySelectorAll(
'div[id^="i_confiform_registration_panel_"],' +
'[id*="confiform_registration_panel"]'
);
for (var j = 0; j < registrationPanels.length; j++) {
addCandidate(registrationPanels[j]);
}
var forms = document.querySelectorAll(
'form.aui-confiforms,' +
'form[id^="i_confiform_registration_form_"],' +
'form[id*="confiform_registration_form"]'
);
for (var k = 0; k < forms.length; k++) {
addCandidate(forms[k]);
}
var best = null;
var bestScore = 0;
for (var x = 0; x < candidates.length; x++) {
var s = scorePanel(candidates[x]);
if (s > bestScore) {
bestScore = s;
best = candidates[x];
}
}
if (best && bestScore >= minMatches) {
return best;
}
return null;
}
function findMediQAssetFormPanel() {
/*
* IMPORTANT:
* Do NOT choose a ConfiForms panel by its position on the page.
* After adding mediqNewModel that caused the model form to be
* mistaken for the asset form.
*
* The asset form is identified by its own field signature.
*/
var byFields = mqFindConfiFormsPanelByFields(
["deviceModel", "deviceId", "deviceName"],
2
);
if (byFields) {
return byFields;
}
/*
* Named lookup is now only a secondary fallback.
*/
var byName =
mqFindConfiFormsRegistrationPanel(
"mediqNewAsset"
);
if (byName) {
var html = "";
try {
html = String(byName.outerHTML || "").toLowerCase();
} catch (ignore) {}
/*
* Never accept mediqNewModel as the asset form.
*/
if (
html.indexOf("modeltitle") === -1 &&
html.indexOf("modelname") === -1
) {
return byName;
}
}
return null;
}
/* ============================================================
CONFIFORMS LAZY REGISTRATION CONTROL BRIDGE
بعضی نسخههای ConfiForms فرم Embedded را تا قبل از کلیک
روی Registration Control داخل DOM نمیسازند.
============================================================ */
function mqFindRegistrationControl(formName, expectedButtonText) {
var wanted = String(formName || "")
.replace(/\s+/g, " ")
.trim()
.toLowerCase();
var expected = String(expectedButtonText || "")
.replace(/\s+/g, " ")
.trim();
/* ========================================================
1) مطمئنترین روش در نصب فعلی شما:
خود دکمه/لینک Registration Control را از روی Caption
پیدا میکنیم، ولی دکمههای داخل داشبورد مدیکیو را
عمداً نادیده میگیریم.
======================================================== */
var clickables = document.querySelectorAll(
'button, a, input[type="button"], input[type="submit"], ' +
'[role="button"]'
);
for (var i = 0; i < clickables.length; i++) {
var el = clickables[i];
/*
* دکمه «ثبت دارایی جدید» خود داشبورد نباید به عنوان
* Registration Control شناخته شود.
*/
if (
el.closest &&
(
el.closest("#mediq-dashboard") ||
el.closest("#mqCfModal") ||
el.closest("#mqModelModal")
)
) {
continue;
}
var txt = "";
if (
el.tagName &&
el.tagName.toLowerCase() === "input"
) {
txt = el.value || "";
}
else {
txt =
el.textContent ||
el.getAttribute("aria-label") ||
el.getAttribute("title") ||
"";
}
txt = String(txt)
.replace(/\s+/g, " ")
.trim();
if (
expected &&
(
txt === expected ||
txt.indexOf(expected) !== -1
)
) {
return el;
}
}
/* ========================================================
2) پیدا کردن از روی نام فرم در markup خود ConfiForms
======================================================== */
var possible = document.querySelectorAll(
'[class*="confiform"],' +
'[id*="confiform"],' +
'[data-form-name],' +
'[data-formname],' +
'[formname]'
);
for (var j = 0; j < possible.length; j++) {
var node = possible[j];
if (
node.closest &&
(
node.closest("#mediq-dashboard") ||
node.closest("#mqCfModal") ||
node.closest("#mqModelModal")
)
) {
continue;
}
var raw = "";
try {
raw = String(node.outerHTML || "").toLowerCase();
}
catch (ignoreRaw) {}
if (
wanted &&
raw.indexOf(wanted) !== -1
) {
/*
* اگر خود Node کلیکپذیر است همان را برگردان.
*/
var tag =
node.tagName
? node.tagName.toLowerCase()
: "";
if (
tag === "button" ||
tag === "a" ||
(
tag === "input" &&
(
node.type === "button" ||
node.type === "submit"
)
) ||
node.getAttribute("role") === "button"
) {
return node;
}
var inner =
node.querySelector(
'button, a, input[type="button"], ' +
'input[type="submit"], [role="button"]'
);
if (inner) {
return inner;
}
return node;
}
}
/* ========================================================
3) آخرین fallback:
Caption را در متن Wrapperهای خارج از داشبورد جستجو کن.
======================================================== */
if (expected) {
var wrappers = document.querySelectorAll(
"div, span, p, td"
);
for (var k = 0; k < wrappers.length; k++) {
var w = wrappers[k];
if (
w.closest &&
(
w.closest("#mediq-dashboard") ||
w.closest("#mqCfModal") ||
w.closest("#mqModelModal")
)
) {
continue;
}
var wText =
String(w.textContent || "")
.replace(/\s+/g, " ")
.trim();
if (
wText === expected ||
wText.indexOf(expected) !== -1
) {
var child =
w.querySelector(
'button, a, input[type="button"], ' +
'input[type="submit"], [role="button"]'
);
if (child) {
return child;
}
}
}
}
return null;
}
function mqClickRegistrationControl(control, expectedButtonText) {
if (!control) return false;
var expected = String(expectedButtonText || "")
.replace(/\s+/g, " ")
.trim();
function getCaption(el) {
if (!el) return "";
var txt = "";
if (
el.tagName &&
el.tagName.toLowerCase() === "input"
) {
txt = el.value || "";
}
else {
txt =
el.textContent ||
el.getAttribute("aria-label") ||
el.getAttribute("title") ||
"";
}
return String(txt)
.replace(/\s+/g, " ")
.trim();
}
function isClickable(el) {
if (!el || !el.tagName) return false;
var tag =
el.tagName.toLowerCase();
return (
tag === "button" ||
tag === "a" ||
(
tag === "input" &&
(
el.type === "button" ||
el.type === "submit"
)
) ||
el.getAttribute("role") === "button"
);
}
/* Finder ممکن است خود دکمه Registration Control را برگرداند. */
if (isClickable(control)) {
var ownCaption =
getCaption(control);
if (
!expected ||
ownCaption === expected ||
ownCaption.indexOf(expected) !== -1
) {
try {
control.click();
return true;
}
catch (ignoreDirectClick) {}
}
}
var candidates =
control.querySelectorAll
? control.querySelectorAll(
'button, a, input[type="button"], ' +
'input[type="submit"], [role="button"]'
)
: [];
/* اول Caption دقیق را کلیک کن. */
for (var i = 0; i < candidates.length; i++) {
var txt =
getCaption(
candidates[i]
);
if (
!expected ||
txt === expected ||
txt.indexOf(expected) !== -1
) {
try {
candidates[i].click();
return true;
}
catch (ignoreClick1) {}
}
}
/* سپس هر کنترل کلیکپذیر موجود. */
if (candidates.length) {
try {
candidates[0].click();
return true;
}
catch (ignoreClick2) {}
}
/* آخرین fallback. */
try {
control.click();
return true;
}
catch (ignoreClick3) {}
return false;
}
function mqWaitForConfiFormsPanel(findFn, onReady, onFail) {
var tries = 0;
var maxTries = 30; /* ~3 seconds */
function check() {
tries++;
var panel = null;
try {
panel = findFn();
} catch (ignoreFind) {}
if (panel) {
onReady(panel);
return;
}
if (tries >= maxTries) {
if (typeof onFail === "function") {
onFail();
}
return;
}
window.setTimeout(check, 100);
}
check();
}
var mqActiveAssetPanel = null;
var mqAssetEnhanceBusy = false;
var mqAssetRefreshTimer = null;
function mqEnsureNativeCloseButton(panel, kind) {
if (!panel) return;
var title =
panel.querySelector(".confiFormsFormTitle") ||
panel.querySelector(".confiFormsFormContent");
if (!title) return;
var selector =
kind === "model"
? ".mq-native-model-close"
: ".mq-native-asset-close";
if (title.querySelector(selector)) return;
var btn = document.createElement("button");
btn.type = "button";
btn.className =
"mq-native-form-close " +
(kind === "model" ? "mq-native-model-close" : "mq-native-asset-close");
btn.setAttribute("aria-label", "بستن");
btn.setAttribute("title", "بستن");
btn.textContent = "×";
btn.onclick = function (e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
if (kind === "model") {
closeMediQModelForm();
} else {
closeMediQAssetForm();
}
return false;
};
title.appendChild(btn);
}
function mqEnhanceLiveAssetPanel(panel) {
if (!panel || mqAssetEnhanceBusy) return;
var form =
panel.querySelector("form.aui-confiforms") ||
panel.querySelector("form");
if (!form) return;
mqAssetEnhanceBusy = true;
try {
mqSectionizeConfiForm(
panel,
MQ_ASSET_FORM_SECTIONS,
["assetObjectId", "devicePageId"]
);
mqFixAssetPlaceholders(panel);
mqInjectModelPlus(panel);
mqEnsureNativeCloseButton(panel, "asset");
panel.style.display = "block";
panel.style.opacity = "1";
panel.style.visibility = "visible";
panel.style.pointerEvents = "auto";
mqActiveAssetPanel = panel;
} finally {
mqAssetEnhanceBusy = false;
}
}
function mqRefreshLiveAssetPanel() {
if (!document.body.classList.contains("mq-asset-form-open")) return;
var panel = findMediQAssetFormPanel();
if (!panel) return;
/*
* ConfiForms may replace the entire panel OR only its inner form after a
* dropdown selection. In both cases re-run the visual enhancement, but
* never move the panel in the DOM.
*/
var needsEnhance =
panel !== mqActiveAssetPanel ||
!panel.querySelector(".mq-form-section-row") ||
!panel.querySelector(".mq-native-asset-close");
if (needsEnhance) {
mqEnhanceLiveAssetPanel(panel);
}
}
function mqScheduleLiveAssetRefresh() {
window.clearTimeout(mqAssetRefreshTimer);
mqAssetRefreshTimer = window.setTimeout(function () {
mqRefreshLiveAssetPanel();
}, 90);
window.setTimeout(mqRefreshLiveAssetPanel, 220);
window.setTimeout(mqRefreshLiveAssetPanel, 500);
window.setTimeout(mqRefreshLiveAssetPanel, 900);
}
function mqMountAssetPanel(panel) {
var modal = document.getElementById("mqCfModal");
if (!panel || !modal) {
showToast("فرم ثبت دارایی آماده نشد.");
return;
}
/*
* CRITICAL:
* Do NOT append/move the ConfiForms panel.
* Insight/Select2 AJAX refresh expects the panel to stay under the
* original ConfiForms macro container.
*/
mqActiveAssetPanel = panel;
document.body.classList.add("mq-asset-form-open");
modal.classList.add("open");
modal.setAttribute("aria-hidden", "false");
mqEnhanceLiveAssetPanel(panel);
mqRestoreAssetDraft(panel);
window.setTimeout(function () {
mqRefreshLiveAssetPanel();
var current = findMediQAssetFormPanel();
if (!current) return;
var first = current.querySelector(
'input:not([type="hidden"]):not([disabled]), ' +
'textarea:not([disabled]), ' +
'select:not([disabled])'
);
if (first) first.focus();
}, 80);
}
function openMediQAssetForm() {
try {
window.sessionStorage.setItem(
"mediqPendingReturn",
"newAsset-purchased"
);
} catch (ignore) {}
var panel = findMediQAssetFormPanel();
if (panel) {
mqMountAssetPanel(panel);
return;
}
var control = mqFindRegistrationControl(
"mediqNewAsset",
"ثبت دارایی جدید"
);
if (!control) {
showToast(
"دکمه واقعی «ثبت دارایی جدید» مربوط به ConfiForms در خروجی صفحه پیدا نشد."
);
return;
}
var clicked = mqClickRegistrationControl(
control,
"ثبت دارایی جدید"
);
if (!clicked) {
showToast(
"امکان اجرای Registration Control فرم دارایی وجود نداشت."
);
return;
}
mqWaitForConfiFormsPanel(
findMediQAssetFormPanel,
function (readyPanel) {
mqMountAssetPanel(readyPanel);
},
function () {
showToast(
"ConfiForms فرم ثبت دارایی را بعد از کلیک Registration Control ایجاد نکرد."
);
}
);
}
function closeMediQAssetForm() {
var modal = document.getElementById("mqCfModal");
var panel = findMediQAssetFormPanel();
mqCloseSelect2Dropdowns(panel || document);
document.body.classList.remove("mq-asset-form-open");
if (modal) {
modal.classList.remove("open");
modal.setAttribute("aria-hidden", "true");
}
mqActiveAssetPanel = null;
window.setTimeout(function () {
mqCloseSelect2Dropdowns(document);
}, 30);
}
(function bindMediQAssetModal() {
var modal = document.getElementById("mqCfModal");
var close = document.getElementById("mqCfClose");
if (close) {
close.onclick = closeMediQAssetForm;
}
if (modal) {
modal.onclick = function (e) {
if (e.target === modal) {
closeMediQAssetForm();
}
};
}
document.addEventListener("keydown", function (e) {
if (e.key === "Escape" && modal && modal.classList.contains("open")) {
closeMediQAssetForm();
}
});
})();
/* ============================================================
MEDIQ - SECTIONED FORMS / MODEL QUICK CREATE / SELECT2 CLEANUP
============================================================ */
var MQ_ASSET_FORM_SECTIONS = [
{ title:"مشخصات اصلی", fields:["deviceModel","deviceId","deviceName","serialNumber","assetNumber"] },
{ title:"خرید و اطلاعات مالی", fields:["purchaseDate","supplier","purchaseValueIRR","purchaseValueUSD","manufactureDate","expiryDate"] },
{ title:"موقعیت و مسئولیت", fields:["department","operatingRoom","businessUnit","responsibleUnit","receiver","accessories"] },
{ title:"وضعیت و بهرهبرداری", fields:["status","accessStatus","statusReason","usageMode","fallRisk","combinedFunction","aggregateValue","priority","emergency","portable","transportability","clinicalUser","entryDateTime","exitDateTime","inStore","storeLocation","financialCenter"] }
];
var MQ_MODEL_FORM_SECTIONS = [
{ title:"مشخصات اصلی مدل", fields:["modelTitle","modelName","deviceTitle","manufacturer","nature"] },
{ title:"طبقهبندی", fields:["modelType","modelGroup","modelFunction","criticality","technology"] },
{ title:"نیازمندیهای مصرفی", fields:["powerRequirement","waterRequirement","gasRequirement"] }
];
var MQ_FORM_LABELS = {
deviceModel:"مدل دستگاه",
deviceId:"شناسه دستگاه",
deviceName:"نام دستگاه",
serialNumber:"شماره سریال",
assetNumber:"شماره اموال",
purchaseDate:"تاریخ خرید",
supplier:"فروشنده",
purchaseValueIRR:"ارزش ریالی خرید",
purchaseValueUSD:"ارزش دلاری خرید",
manufactureDate:"تاریخ تولید",
expiryDate:"تاریخ انقضا",
department:"بخش بهرهبردار",
operatingRoom:"موقعیت مکانی فعلی",
businessUnit:"محل کاربری",
responsibleUnit:"مسئول بهرهبرداری",
receiver:"تحویلگیرنده",
accessories:"متعلقات",
status:"وضعیت",
accessStatus:"وضعیت دسترسی",
statusReason:"علت وضعیت فعلی",
usageMode:"نحوه مصرف",
fallRisk:"آیا با خرابی این جزء دستگاه ترکیبی ساقط میشود؟",
combinedFunction:"عملکرد در مجموعههای ترکیبی",
aggregateValue:"ارزش ریالی/ارزی تجمیعی",
priority:"اولویت",
emergency:"اورژانسی",
portable:"قابل حمل",
transportability:"قابلیت حمل",
clinicalUser:"کاربر کلینیکال",
entryDateTime:"زمان ورود",
exitDateTime:"زمان خروج",
inStore:"در انبار",
storeLocation:"محل انبار",
financialCenter:"مرکز مالی",
modelTitle:"عنوان مدل",
modelName:"مدل دستگاه",
deviceTitle:"عنوان دستگاه",
manufacturer:"شرکت سازنده",
nature:"ماهیت دستگاه",
modelType:"نوع",
modelGroup:"گروه",
modelFunction:"کارکرد",
criticality:"سطح اهمیت",
technology:"فناوری",
powerRequirement:"برق مصرفی",
waterRequirement:"آب مصرفی",
gasRequirement:"گاز مصرفی"
};
function mqCloseSelect2Dropdowns(scope) {
var jq = null;
try {
jq = (window.AJS && AJS.$) ? AJS.$ : (window.jQuery || null);
} catch (ignore) {}
if (jq) {
try {
jq(scope || document)
.find('select, input')
.add(jq('select, input'))
.each(function () {
try {
var $el = jq(this);
if (
$el.data('select2') ||
$el.hasClass('select2-offscreen') ||
$el.hasClass('select2-hidden-accessible')
) {
$el.select2('close');
}
} catch (ignore2) {}
});
} catch (ignore3) {}
try {
jq('.select2-drop-active').removeClass('select2-drop-active').hide();
jq('.select2-container-active').removeClass('select2-container-active');
jq('.select2-container--open').removeClass('select2-container--open');
jq('#select2-drop-mask,.select2-drop-mask').hide();
jq('body > .select2-drop, body > .aui-select2-drop').hide();
} catch (ignore4) {}
}
var floating = document.querySelectorAll(
'body > .select2-drop,' +
'body > .select2-drop-mask,' +
'.select2-drop-active,' +
'.aui-select2-drop,' +
'.select2-dropdown'
);
for (var i = 0; i < floating.length; i++) {
floating[i].classList.remove('select2-drop-active');
floating[i].style.display = 'none';
}
var opened = document.querySelectorAll(
'.select2-container-active, .select2-container--open'
);
for (var j = 0; j < opened.length; j++) {
opened[j].classList.remove('select2-container-active');
opened[j].classList.remove('select2-container--open');
}
}
function mqFindNamedField(form, name) {
if (!form || !name) return null;
return form.querySelector('[name="' + name + '"], [name="' + name + '[]"]') ||
form.querySelector('[id$="_' + name + '"], [id*="' + name + '"]');
}
function mqFieldRow(form, name) {
var field = mqFindNamedField(form, name);
if (!field) return null;
return field.closest('tr') || field.closest('.field-group') || field.parentElement;
}
function mqPersianizeField(form, name) {
var field = mqFindNamedField(form, name);
if (!field) return;
var labelText = MQ_FORM_LABELS[name];
if (!labelText) return;
var id = field.getAttribute('id');
var label = id ? form.querySelector('label[for="' + id + '"]') : null;
if (!label) {
var row = field.closest('tr');
if (row) label = row.querySelector('label');
}
if (label) {
var required = label.querySelector('.aui-iconfont-required, .required, .cf_required');
label.childNodes.forEach && Array.prototype.forEach.call(label.childNodes, function (n) {
if (n.nodeType === 3) n.nodeValue = '';
});
if (!required) label.textContent = labelText;
else label.insertBefore(document.createTextNode(labelText + ' '), required);
}
}
function mqSectionizeConfiForm(panel, sections, systemFields) {
if (!panel) return;
var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
if (!form) return;
var old = form.querySelectorAll('.mq-form-section-row');
for (var z = 0; z < old.length; z++) old[z].parentNode && old[z].parentNode.removeChild(old[z]);
Object.keys(MQ_FORM_LABELS).forEach(function (name) { mqPersianizeField(form, name); });
(systemFields || []).forEach(function (name) {
var row = mqFieldRow(form, name);
if (row) row.classList.add('mq-system-field');
});
sections.forEach(function (section) {
var firstRow = null;
for (var i = 0; i < section.fields.length; i++) {
var row = mqFieldRow(form, section.fields[i]);
if (row && row.tagName && row.tagName.toLowerCase() === 'tr') {
firstRow = row;
break;
}
}
if (!firstRow || !firstRow.parentNode) return;
var tr = document.createElement('tr');
tr.className = 'mq-form-section-row';
var td = document.createElement('td');
td.setAttribute('colspan', '99');
td.innerHTML = '<div class="mq-form-section-title">' + section.title + '</div>';
tr.appendChild(td);
firstRow.parentNode.insertBefore(tr, firstRow);
});
}
function mqFindDeviceModelField(form) {
if (!form) return null;
var field =
mqFindNamedField(form, 'deviceModel') ||
form.querySelector('[name$="deviceModel"], [name*="deviceModel"], [id$="deviceModel"], [id*="deviceModel"]');
if (field) return field;
var rows = form.querySelectorAll('tr, .field-group');
for (var i = 0; i < rows.length; i++) {
var txt = (rows[i].textContent || '').replace(/\s+/g, ' ').trim();
if (txt.indexOf('مدل دستگاه') !== -1) {
return rows[i].querySelector(
'input.select2-offscreen, input.select2-hidden-accessible, select, input, .select2-container'
);
}
}
return null;
}
function mqFindDeviceModelVisual(form, field) {
if (!form || !field) return null;
if (field.classList && field.classList.contains('select2-container')) {
return field;
}
var row = field.closest('tr') || field.closest('.field-group') || field.parentElement;
if (row) {
var visibleInRow = row.querySelector('.select2-container');
if (visibleInRow) return visibleInRow;
}
var next = field.nextElementSibling;
if (next && next.classList && next.classList.contains('select2-container')) {
return next;
}
if (field.parentElement) {
var visibleInParent = field.parentElement.querySelector('.select2-container');
if (visibleInParent) return visibleInParent;
}
return field;
}
function mqInjectModelPlus(panel) {
if (!panel) return;
var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
if (!form) return;
if (form.querySelector('#mqAddModelBtn, .mq-model-plus')) return;
var field = mqFindDeviceModelField(form);
if (!field) return;
var visual = mqFindDeviceModelVisual(form, field);
if (!visual || !visual.parentNode) return;
var cell = visual.closest('td') || field.closest('td') || visual.parentNode;
if (!cell) return;
cell.classList.add('mq-model-field-cell');
var wrap = cell.querySelector('.mq-device-model-wrap');
if (!wrap) {
wrap = document.createElement('div');
wrap.className = 'mq-device-model-wrap';
visual.parentNode.insertBefore(wrap, visual);
wrap.appendChild(visual);
}
var btn = document.createElement('button');
btn.id = 'mqAddModelBtn';
btn.type = 'button';
btn.className = 'mq-model-plus';
btn.setAttribute('title', 'ثبت مدل جدید');
btn.setAttribute('aria-label', 'ثبت مدل جدید');
btn.textContent = '+';
btn.onclick = function (e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
mqCloseSelect2Dropdowns(panel);
window.setTimeout(function () {
openMediQModelForm();
}, 30);
return false;
};
wrap.appendChild(btn);
}
function mqFixAssetPlaceholders(panel) {
if (!panel) return;
var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
if (!form) return;
var idField = mqFindNamedField(form, 'deviceId');
var nameField = mqFindNamedField(form, 'deviceName');
if (idField && idField.tagName && idField.tagName.toLowerCase() === 'input') {
idField.setAttribute('placeholder', 'شناسه دستگاه را وارد کنید');
}
if (nameField && nameField.tagName && nameField.tagName.toLowerCase() === 'input') {
nameField.setAttribute('placeholder', 'نام دستگاه را وارد کنید');
}
}
function mqScheduleAssetFormEnhancements(panel) {
if (!panel) return;
var tries = [0, 80, 180, 350, 600, 1000];
for (var i = 0; i < tries.length; i++) {
(function (delay) {
window.setTimeout(function () {
mqFixAssetPlaceholders(panel);
mqInjectModelPlus(panel);
}, delay);
})(tries[i]);
}
}
var mqModelOriginalParent = null;
var mqModelOriginalNext = null;
function findMediQModelFormPanel() {
/*
* The model form is identified by modelTitle + modelName.
* This prevents it from ever being selected as mediqNewAsset.
*/
var byFields = mqFindConfiFormsPanelByFields(
["modelTitle", "modelName"],
2
);
if (byFields) {
return byFields;
}
return mqFindConfiFormsRegistrationPanel(
"mediqNewModel"
);
}
function mqSnapshotAssetDraft() {
var panel = findMediQAssetFormPanel();
if (!panel) return;
var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
if (!form) return;
var data = {};
var controls = form.querySelectorAll('input[name], textarea[name], select[name]');
for (var i = 0; i < controls.length; i++) {
var c = controls[i];
var name = c.name;
if (!name || name === 'deviceModel' || c.type === 'hidden' || c.type === 'submit' || c.type === 'button') continue;
if (c.type === 'checkbox' || c.type === 'radio') data[name] = !!c.checked;
else data[name] = c.value;
}
try { window.sessionStorage.setItem('mediqAssetDraft', JSON.stringify(data)); } catch (ignore) {}
}
function mqRestoreAssetDraft(panel) {
if (!panel) return;
var raw = '';
try { raw = window.sessionStorage.getItem('mediqAssetDraft') || ''; } catch (ignore) {}
if (!raw) return;
var data = {};
try { data = JSON.parse(raw); } catch (ignore2) { return; }
var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
if (!form) return;
Object.keys(data).forEach(function (name) {
var c = mqFindNamedField(form, name);
if (!c) return;
if (c.type === 'checkbox' || c.type === 'radio') c.checked = !!data[name];
else c.value = data[name];
});
try { window.sessionStorage.removeItem('mediqAssetDraft'); } catch (ignore3) {}
}
var mqActiveModelPanel = null;
var mqModelEnhanceBusy = false;
var mqModelRefreshTimer = null;
function mqEnhanceLiveModelPanel(panel) {
if (!panel || mqModelEnhanceBusy) return;
var form =
panel.querySelector("form.aui-confiforms") ||
panel.querySelector("form");
if (!form) return;
mqModelEnhanceBusy = true;
try {
mqSectionizeConfiForm(
panel,
MQ_MODEL_FORM_SECTIONS,
[]
);
Object.keys(MQ_FORM_LABELS).forEach(function (name) {
mqPersianizeField(form, name);
});
mqEnsureNativeCloseButton(panel, "model");
panel.style.display = "block";
panel.style.opacity = "1";
panel.style.visibility = "visible";
panel.style.pointerEvents = "auto";
mqActiveModelPanel = panel;
} finally {
mqModelEnhanceBusy = false;
}
}
function mqRefreshLiveModelPanel() {
if (!document.body.classList.contains("mq-model-form-open")) return;
var panel = findMediQModelFormPanel();
if (!panel) return;
var needsEnhance =
panel !== mqActiveModelPanel ||
!panel.querySelector(".mq-form-section-row") ||
!panel.querySelector(".mq-native-model-close");
if (needsEnhance) {
mqEnhanceLiveModelPanel(panel);
}
}
function mqScheduleLiveModelRefresh() {
window.clearTimeout(mqModelRefreshTimer);
mqModelRefreshTimer = window.setTimeout(function () {
mqRefreshLiveModelPanel();
}, 90);
window.setTimeout(mqRefreshLiveModelPanel, 220);
window.setTimeout(mqRefreshLiveModelPanel, 500);
window.setTimeout(mqRefreshLiveModelPanel, 900);
}
function mqMountModelPanel(panel) {
var modal = document.getElementById("mqModelModal");
if (!panel || !modal) {
showToast("فرم ثبت مدل آماده نشد.");
return;
}
mqActiveModelPanel = panel;
/*
* Asset form remains in DOM and keeps its data, but visually sits under
* the model backdrop while model form is open.
*/
document.body.classList.add("mq-model-form-open");
modal.classList.add("open");
modal.setAttribute("aria-hidden", "false");
mqEnhanceLiveModelPanel(panel);
window.setTimeout(function () {
mqRefreshLiveModelPanel();
var current = findMediQModelFormPanel();
if (!current) return;
var first = current.querySelector(
'input:not([type="hidden"]):not([disabled]), ' +
'textarea:not([disabled]), ' +
'select:not([disabled])'
);
if (first) first.focus();
}, 80);
}
function openMediQModelForm() {
mqSnapshotAssetDraft();
mqCloseSelect2Dropdowns(document);
var panel = findMediQModelFormPanel();
if (panel) {
mqMountModelPanel(panel);
return;
}
var control = mqFindRegistrationControl(
"mediqNewModel",
"ثبت مدل جدید"
);
if (!control) {
showToast(
"Registration Control فرم mediqNewModel پیدا نشد."
);
return;
}
var clicked = mqClickRegistrationControl(
control,
"ثبت مدل جدید"
);
if (!clicked) {
showToast(
"امکان اجرای Registration Control فرم مدل وجود نداشت."
);
return;
}
mqWaitForConfiFormsPanel(
findMediQModelFormPanel,
function (readyPanel) {
mqMountModelPanel(readyPanel);
},
function () {
showToast(
"ConfiForms فرم ثبت مدل را بعد از کلیک Registration Control ایجاد نکرد."
);
}
);
}
function closeMediQModelForm() {
var modal = document.getElementById("mqModelModal");
var panel = findMediQModelFormPanel();
mqCloseSelect2Dropdowns(panel || document);
document.body.classList.remove("mq-model-form-open");
if (modal) {
modal.classList.remove("open");
modal.setAttribute("aria-hidden", "true");
}
mqActiveModelPanel = null;
/*
* Re-apply asset layout after closing model, because the asset form
* was never moved or destroyed.
*/
window.setTimeout(function () {
mqRefreshLiveAssetPanel();
}, 80);
}
(function bindMediQModelModal() {
var modal = document.getElementById('mqModelModal');
var close = document.getElementById('mqModelClose');
if (close) close.onclick = closeMediQModelForm;
if (modal) {
modal.onclick = function (e) {
if (e.target === modal) closeMediQModelForm();
};
}
})();
/* ============================================================
CONFIFORMS / SELECT2 AJAX REFRESH WATCH
No re-parenting. Only re-apply presentation after plugin redraw.
============================================================ */
document.addEventListener("change", function (e) {
if (
document.body.classList.contains("mq-asset-form-open")
) {
mqScheduleLiveAssetRefresh();
}
if (
document.body.classList.contains("mq-model-form-open")
) {
mqScheduleLiveModelRefresh();
}
}, true);
try {
var mqLiveJq =
(window.AJS && AJS.$)
? AJS.$
: (window.jQuery || null);
if (mqLiveJq) {
mqLiveJq(document)
.off(".mediqLiveForms")
.on(
"select2-selected.mediqLiveForms " +
"select2:select.mediqLiveForms " +
"select2-removed.mediqLiveForms " +
"select2:unselect.mediqLiveForms",
"input,select",
function () {
if (
document.body.classList.contains(
"mq-asset-form-open"
)
) {
mqScheduleLiveAssetRefresh();
}
if (
document.body.classList.contains(
"mq-model-form-open"
)
) {
mqScheduleLiveModelRefresh();
}
}
);
}
} catch (ignoreLiveFormEvents) {}
/*
* Observe only for replacement/redraw of the ConfiForms panel.
* We never move nodes, so this is safe with ConfiForms AJAX.
*/
var mqLiveFormsObserver = null;
var mqLiveFormsObserverTimer = null;
if (window.MutationObserver) {
mqLiveFormsObserver =
new MutationObserver(function () {
if (
!document.body.classList.contains("mq-asset-form-open") &&
!document.body.classList.contains("mq-model-form-open")
) {
return;
}
window.clearTimeout(
mqLiveFormsObserverTimer
);
mqLiveFormsObserverTimer =
window.setTimeout(function () {
if (
document.body.classList.contains(
"mq-asset-form-open"
)
) {
mqRefreshLiveAssetPanel();
}
if (
document.body.classList.contains(
"mq-model-form-open"
)
) {
mqRefreshLiveModelPanel();
}
}, 120);
});
mqLiveFormsObserver.observe(
document.body,
{
childList:true,
subtree:true
}
);
}
/* Extra cleanup for dropdowns rendered outside the MediQ modal. */
document.addEventListener('click', function (e) {
var assetModal = document.getElementById('mqCfModal');
var closeBtn = e.target && e.target.closest ? e.target.closest('#mqCfClose') : null;
if (closeBtn || (assetModal && e.target === assetModal)) {
mqCloseSelect2Dropdowns(document);
window.setTimeout(function () { mqCloseSelect2Dropdowns(document); }, 30);
window.setTimeout(function () { mqCloseSelect2Dropdowns(document); }, 150);
}
}, true);
/* ============================================================
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 active = document.querySelector('#mediq-dashboard [data-tree-key="' + key + '"]');
if (active) active.classList.add("active");
/* Default collapse */
mqTreeOpen("equipment", false);
mqTreeOpen("logistics", false);
mqTreeOpen("newAsset", false);
mqTreeOpen("editAsset", false);
if (key === "equipment" || key === "property" || key === "equipmentMaintenance" || key === "finance" ||
key === "logistics" || key === "purchase" || key === "newAsset" || key === "editAsset" ||
key === "consumable" || key.indexOf("newAsset-") === 0 || key.indexOf("editAsset-") === 0) {
mqTreeOpen("equipment", true);
var p1 = document.querySelector('[data-tree-key="equipment"]');
if (p1 && key !== "equipment") p1.classList.add("parent-active");
}
if (key === "logistics" || key === "purchase" || key === "newAsset" || key === "editAsset" ||
key === "consumable" || key.indexOf("newAsset-") === 0 || key.indexOf("editAsset-") === 0) {
mqTreeOpen("logistics", true);
var p2 = document.querySelector('[data-tree-key="logistics"]');
if (p2 && key !== "logistics") p2.classList.add("parent-active");
}
if (key === "newAsset" || key.indexOf("newAsset-") === 0) {
mqTreeOpen("newAsset", true);
var p3 = document.querySelector('[data-tree-key="newAsset"]');
if (p3 && key !== "newAsset") p3.classList.add("parent-active");
}
if (key.indexOf("editAsset-") === 0) {
mqTreeOpen("editAsset", true);
var p4 = document.querySelector('[data-tree-key="editAsset"]');
if (p4) p4.classList.add("parent-active");
}
}
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 .mq-tree-row[data-tree-action]");
for (var i = 0; i < rows.length; i++) {
rows[i].onclick = function () {
var action = this.getAttribute("data-tree-action");
if (action === "equipment") {
renderEquipment();
}
else if (action === "property") {
mqTreeSimpleEquipmentPage("مدیریت اموال", "property");
}
else if (action === "equipmentMaintenance") {
mqTreeSimpleEquipmentPage("مدیریت نگهداری و تعمیر", "equipmentMaintenance");
}
else if (action === "finance") {
mqTreeSimpleEquipmentPage("مدیریت مالی و بهرهوری", "finance");
}
else if (action === "logistics") {
renderLogistics();
}
else if (action === "purchase") {
state.screen = "purchase";
renderSimplePage("خرید دارایی");
mqTreeActivate("purchase");
}
else if (action === "newAsset") {
state.selectedAssetSection = "purchased";
renderAssetSections("newAsset");
}
else if (action === "editAsset") {
renderEditAssetWorkspace();
}
else if (action === "consumable") {
state.screen = "consumable";
renderSimplePage("کالاهای مصرفی");
mqTreeActivate("consumable");
}
else if (action === "section") {
var mode = this.getAttribute("data-mode");
var section = this.getAttribute("data-section");
if (state.screen !== mode) {
state.selectedAssetSection = section;
renderAssetSections(mode);
} else {
renderPreview(section);
}
mqTreeActivate(mode + "-" + section);
}
else if (action === "cycle") {
var cycle = this.getAttribute("data-cycle");
if (cycle === "operation") {
renderOtherCycle("operation", "بهرهبرداری");
mqTreeActivate("operation");
}
else if (cycle === "replacement") {
renderOtherCycle("replacement", "جایگزینی");
mqTreeActivate("replacement");
}
else if (cycle === "maintenance") {
renderOtherCycle("maintenance", "نگهداری");
mqTreeActivate("maintenanceCycle");
}
}
};
}
}
/* ============================================================
CONFIFORMS SAVE CALLBACK
============================================================ */
(function mqBindConfiFormsSaveCallback() {
var previous = window.onCFSubmitFinished;
window.onCFSubmitFinished = function (formName) {
try {
if (typeof previous === 'function') previous.apply(this, arguments);
} catch (ignore) {}
if (formName === 'mediqNewModel') {
/*
* V47:
* فقط فرم مدل بسته میشود.
* فرم ثبت دارایی باز میماند تا کاربر همان مدل جدید را انتخاب کند.
* هیچ Reloadای در این مرحله انجام نمیشود.
*/
closeMediQModelForm();
try {
window.sessionStorage.removeItem('mediqAssetDraft');
window.sessionStorage.removeItem('mediqOpenAssetAfterReload');
} catch (ignoreModel) {}
window.setTimeout(function () {
var assetPanel = findMediQAssetFormPanel();
if (!assetPanel) return;
mqCloseSelect2Dropdowns(assetPanel);
var assetForm =
assetPanel.querySelector('form.aui-confiforms') ||
assetPanel.querySelector('form');
if (assetForm) {
var modelField =
mqFindNamedField(assetForm, 'deviceModel') ||
mqFindDeviceModelField(assetForm);
if (modelField) {
try {
var jq =
(window.AJS && AJS.$)
? AJS.$
: (window.jQuery || null);
if (jq) {
try { jq(modelField).select2('close'); } catch (ignoreClose) {}
try { jq(modelField).trigger('change'); } catch (ignoreChange) {}
}
} catch (ignorePickerRefresh) {}
}
}
mqRefreshLiveAssetPanel();
mqScheduleAssetFormEnhancements(assetPanel);
}, 180);
showToast('مدل جدید ثبت شد؛ فرم دارایی باز است و میتوانید مدل جدید را انتخاب کنید.');
return;
}
if (formName === 'mediqNewAsset') {
var target = 'newAsset-purchased';
try {
target = window.sessionStorage.getItem('mediqPendingReturn') ||
(state.screen === 'editAsset' ? 'editAsset' : 'newAsset-purchased');
window.sessionStorage.removeItem('mediqPendingReturn');
window.sessionStorage.setItem('mediqResumeView', target);
} catch (ignore2) {}
window.setTimeout(function () {
window.location.reload();
}, 450);
}
};
})();
/* ============================================================
MEDIQ V47 - MODEL OBJECT + BUTTONS / KEEP ASSET OPEN / NESTED CLOSE SYNC
IMPORTANT: this block must live INSIDE the main MediQ IIFE.
============================================================ */
var MQ_MODEL_REFERENCE_CFG = {
deviceTitle: {
label: "عنوان دستگاه",
formName: "mediqNewEquipmentTitle",
buttonText: "ثبت عنوان دستگاه جدید"
},
manufacturer: {
label: "شرکت سازنده",
formName: "mediqNewManufacturer",
buttonText: "ثبت شرکت سازنده جدید"
},
modelType: {
label: "نوع",
formName: "mediqNewFacility",
buttonText: "ثبت نوع جدید"
},
modelGroup: {
label: "گروه",
formName: "mediqNewClassification",
buttonText: "ثبت گروه جدید"
}
};
/* Model page must expose every real Models attribute except system-managed ones. */
MQ_MODEL_FORM_SECTIONS = [
{ title:"مشخصات اصلی مدل", fields:["modelName","deviceTitle","manufacturer","nature"] },
{ title:"طبقهبندی", fields:["modelType","modelGroup","modelFunction","criticality","technology"] },
{ title:"نیازمندیهای مصرفی", fields:["powerRequirement","waterRequirement","gasRequirement"] }
];
MQ_FORM_LABELS.modelTitle = "عنوان مدل";
MQ_FORM_LABELS.modelName = "مدل دستگاه";
MQ_FORM_LABELS.deviceTitle = "عنوان دستگاه";
MQ_FORM_LABELS.manufacturer = "شرکت سازنده";
MQ_FORM_LABELS.nature = "ماهیت دستگاه";
MQ_FORM_LABELS.technicalInfo = "اطلاعات فنی";
MQ_FORM_LABELS.modelType = "نوع";
MQ_FORM_LABELS.modelGroup = "گروه";
MQ_FORM_LABELS.modelFunction = "کارکرد";
MQ_FORM_LABELS.criticality = "سطح اهمیت";
MQ_FORM_LABELS.technology = "فناوری";
MQ_FORM_LABELS.powerRequirement = "برق مصرفی";
MQ_FORM_LABELS.waterRequirement = "آب مصرفی";
MQ_FORM_LABELS.gasRequirement = "گاز مصرفی";
function mqNormalizeTextV46(v) {
return String(v == null ? "" : v).replace(/\s+/g, " ").trim();
}
function mqFindModelFieldV46(form, fieldName, labelText) {
if (!form) return null;
var direct = mqFindNamedField(form, fieldName);
if (direct) return direct;
var selectors = [
'[data-field-name="' + fieldName + '"]',
'[data-fieldname="' + fieldName + '"]',
'[id*="' + fieldName + '"]',
'[name*="' + fieldName + '"]'
];
for (var s = 0; s < selectors.length; s++) {
try {
var byAttr = form.querySelector(selectors[s]);
if (byAttr) return byAttr;
} catch (ignoreSelector) {}
}
var rows = form.querySelectorAll('tr, .field-group, .control-group');
var wanted = mqNormalizeTextV46(labelText);
for (var i = 0; i < rows.length; i++) {
var txt = mqNormalizeTextV46(rows[i].textContent || "");
if (!wanted || txt.indexOf(wanted) === -1) continue;
var c = rows[i].querySelector(
'input.select2-offscreen, input.select2-hidden-accessible, select, input[name], textarea[name], .select2-container'
);
if (c) return c;
}
return null;
}
function mqReferenceVisualV46(form, field) {
if (!form || !field) return null;
if (field.classList && field.classList.contains('select2-container')) {
return field;
}
var row =
(field.closest && field.closest('tr')) ||
(field.closest && field.closest('.field-group')) ||
(field.closest && field.closest('.control-group')) ||
field.parentElement;
if (row) {
var select2 = row.querySelector('.select2-container');
if (select2) return select2;
}
if (field.nextElementSibling && field.nextElementSibling.classList &&
field.nextElementSibling.classList.contains('select2-container')) {
return field.nextElementSibling;
}
return field;
}
function mqFieldDisplayTextV46(form, fieldName, labelText) {
var field = mqFindModelFieldV46(form, fieldName, labelText);
if (!field) return "";
var row =
(field.closest && field.closest('tr')) ||
(field.closest && field.closest('.field-group')) ||
(field.closest && field.closest('.control-group')) ||
field.parentElement;
if (row) {
var rendered = row.querySelector(
'.select2-chosen, .select2-selection__rendered, .aui-select2-choice .select2-chosen'
);
if (rendered) {
var text = mqNormalizeTextV46(rendered.textContent || "")
.replace(/^×\s*/, "")
.trim();
if (text && text !== "انتخاب کنید" && text !== "Select") {
return text;
}
}
}
return mqNormalizeTextV46(field.value || "");
}
function mqUpdateAutoModelTitleV46(panel) {
if (!panel) return;
var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
if (!form) return;
var titleField = mqFindNamedField(form, 'modelTitle');
if (!titleField) return;
var deviceTitle = mqFieldDisplayTextV46(form, 'deviceTitle', 'عنوان دستگاه');
var manufacturer = mqFieldDisplayTextV46(form, 'manufacturer', 'شرکت سازنده');
var modelName = mqFieldDisplayTextV46(form, 'modelName', 'مدل دستگاه');
var parts = [];
if (deviceTitle) parts.push(deviceTitle);
if (manufacturer) parts.push(manufacturer);
if (modelName) parts.push(modelName);
var value = parts.join(' - ');
if (!value) return;
titleField.value = value;
titleField.setAttribute('value', value);
try { titleField.dispatchEvent(new Event('input', { bubbles:true })); } catch (ignoreInput) {}
try { titleField.dispatchEvent(new Event('change', { bubbles:true })); } catch (ignoreChange) {}
try { if (window.AJS && AJS.$) AJS.$(titleField).val(value); } catch (ignoreAJS) {}
}
/* ------------------------------------------------------------
Child Reference Modal (ConfiForms-based)
------------------------------------------------------------ */
var mqReferenceActiveV46 = null;
function mqEnsureReferenceBackdropV46() {
var modal = document.getElementById('mqReferenceModalV46');
if (modal) return modal;
modal = document.createElement('div');
modal.id = 'mqReferenceModalV46';
modal.setAttribute('aria-hidden', 'true');
document.body.appendChild(modal);
modal.onclick = function (e) {
if (e.target === modal) {
closeMediQReferenceFormV46();
}
};
return modal;
}
function mqFindReferencePanelV46(cfg) {
if (!cfg) return null;
var panel = mqFindConfiFormsRegistrationPanel(cfg.formName);
if (!panel) return null;
var asset = findMediQAssetFormPanel();
var model = findMediQModelFormPanel();
if (panel === asset || panel === model) return null;
return panel;
}
function mqEnsureReferenceCloseV46(panel) {
if (!panel) return;
var title = panel.querySelector('.confiFormsFormTitle') || panel.querySelector('.confiFormsFormContent');
if (!title || title.querySelector('.mq-native-reference-close-v46')) return;
var btn = document.createElement('button');
btn.type = 'button';
btn.className = 'mq-native-form-close mq-native-reference-close-v46';
btn.setAttribute('aria-label', 'بستن');
btn.setAttribute('title', 'بستن');
btn.textContent = '×';
btn.onclick = function (e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
closeMediQReferenceFormV46();
return false;
};
title.appendChild(btn);
}
function mqMountReferencePanelV46(panel, cfg, fieldName) {
if (!panel || !cfg) return;
var modal = mqEnsureReferenceBackdropV46();
mqReferenceActiveV46 = {
panel: panel,
cfg: cfg,
fieldName: fieldName
};
panel.classList.add('mq-reference-panel-v46');
panel.setAttribute('data-mq-reference-form', cfg.formName);
document.body.classList.add('mq-reference-form-open-v46');
modal.classList.add('open');
modal.setAttribute('aria-hidden', 'false');
mqEnsureReferenceCloseV46(panel);
panel.style.display = 'block';
panel.style.opacity = '1';
panel.style.visibility = 'visible';
panel.style.pointerEvents = 'auto';
window.setTimeout(function () {
var current = mqFindReferencePanelV46(cfg);
if (!current) return;
mqEnsureReferenceCloseV46(current);
var first = current.querySelector(
'input:not([type="hidden"]):not([disabled]), textarea:not([disabled]), select:not([disabled])'
);
if (first) first.focus();
}, 80);
}
function openMediQReferenceFormV46(fieldName) {
var cfg = MQ_MODEL_REFERENCE_CFG[fieldName];
if (!cfg) {
showToast('تنظیمات فیلد مرجع پیدا نشد.');
return;
}
mqCloseSelect2Dropdowns(document);
var panel = mqFindReferencePanelV46(cfg);
if (panel) {
mqMountReferencePanelV46(panel, cfg, fieldName);
return;
}
var control = mqFindRegistrationControl(cfg.formName, cfg.buttonText);
if (!control) {
showToast(
'فرم «' + cfg.formName + '» روی همین صفحه ساخته نشده است.'
);
return;
}
var clicked = mqClickRegistrationControl(control, cfg.buttonText);
if (!clicked) {
showToast('Registration Control فرم «' + cfg.formName + '» اجرا نشد.');
return;
}
mqWaitForConfiFormsPanel(
function () { return mqFindReferencePanelV46(cfg); },
function (readyPanel) { mqMountReferencePanelV46(readyPanel, cfg, fieldName); },
function () { showToast('ConfiForms فرم «' + cfg.formName + '» را ایجاد نکرد.'); }
);
}
function closeMediQReferenceFormV46() {
var modal = document.getElementById('mqReferenceModalV46');
var active = mqReferenceActiveV46;
mqCloseSelect2Dropdowns(active && active.panel ? active.panel : document);
document.body.classList.remove('mq-reference-form-open-v46');
if (modal) {
modal.classList.remove('open');
modal.setAttribute('aria-hidden', 'true');
}
if (active && active.panel) {
active.panel.classList.remove('mq-reference-panel-v46');
active.panel.removeAttribute('data-mq-reference-form');
}
mqReferenceActiveV46 = null;
window.setTimeout(function () {
if (document.body.classList.contains('mq-model-form-open')) {
var panel = findMediQModelFormPanel();
if (panel) {
mqUpdateAutoModelTitleV46(panel);
mqInjectAllModelReferenceButtonsV46(panel);
}
}
}, 80);
}
function mqInjectReferenceButtonV46(panel, fieldName, cfg) {
if (!panel || !cfg) return;
var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
if (!form) return;
if (form.querySelector('.mq-reference-plus-v46[data-mq-ref-field="' + fieldName + '"]')) {
return;
}
var field = mqFindModelFieldV46(form, fieldName, cfg.label);
if (!field) return;
var visual = mqReferenceVisualV46(form, field);
if (!visual) return;
var cell =
(visual.closest && visual.closest('td')) ||
(field.closest && field.closest('td')) ||
(field.closest && field.closest('.field-group')) ||
(field.closest && field.closest('.control-group')) ||
visual.parentElement;
if (!cell) return;
cell.classList.add('mq-reference-cell-v46');
var wrap = cell.querySelector('.mq-reference-control-wrap-v46');
if (!wrap) {
wrap = document.createElement('div');
wrap.className = 'mq-reference-control-wrap-v46';
if (visual.parentNode) {
visual.parentNode.insertBefore(wrap, visual);
wrap.appendChild(visual);
} else {
cell.appendChild(wrap);
}
}
var btn = document.createElement('button');
btn.type = 'button';
btn.className = 'mq-reference-plus-v46';
btn.setAttribute('data-mq-ref-field', fieldName);
btn.setAttribute('title', 'ثبت ' + cfg.label + ' جدید');
btn.setAttribute('aria-label', 'ثبت ' + cfg.label + ' جدید');
btn.textContent = '+';
btn.onclick = function (e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
mqCloseSelect2Dropdowns(panel);
window.setTimeout(function () {
openMediQReferenceFormV46(fieldName);
}, 20);
return false;
};
wrap.appendChild(btn);
}
function mqInjectAllModelReferenceButtonsV46(panel) {
Object.keys(MQ_MODEL_REFERENCE_CFG).forEach(function (fieldName) {
mqInjectReferenceButtonV46(panel, fieldName, MQ_MODEL_REFERENCE_CFG[fieldName]);
});
}
/* Replace model finder with a safe version that cannot confuse the asset form. */
findMediQModelFormPanel = function () {
var panels = document.querySelectorAll('.confiFormsFormBorder, [id^="i_confiform_registration_panel_"]');
for (var i = 0; i < panels.length; i++) {
var form = panels[i].querySelector('form.aui-confiforms') || panels[i].querySelector('form');
if (!form) continue;
var hasModelName = !!mqFindModelFieldV46(form, 'modelName', 'مدل دستگاه');
var hasDeviceTitle = !!mqFindModelFieldV46(form, 'deviceTitle', 'عنوان دستگاه');
var hasManufacturer = !!mqFindModelFieldV46(form, 'manufacturer', 'شرکت سازنده');
var hasModelType = !!mqFindModelFieldV46(form, 'modelType', 'نوع');
var hasModelGroup = !!mqFindModelFieldV46(form, 'modelGroup', 'گروه');
if (hasModelName && (hasDeviceTitle || hasManufacturer || hasModelType || hasModelGroup)) {
return panels[i];
}
}
return mqFindConfiFormsRegistrationPanel('mediqNewModel');
};
var mqOriginalEnhanceModelV46 = mqEnhanceLiveModelPanel;
mqEnhanceLiveModelPanel = function (panel) {
if (!panel || mqModelEnhanceBusy) return;
var form = panel.querySelector('form.aui-confiforms') || panel.querySelector('form');
if (!form) return;
mqModelEnhanceBusy = true;
try {
mqSectionizeConfiForm(
panel,
MQ_MODEL_FORM_SECTIONS,
['modelTitle', 'technicalInfo']
);
Object.keys(MQ_FORM_LABELS).forEach(function (name) {
mqPersianizeField(form, name);
});
mqUpdateAutoModelTitleV46(panel);
mqInjectAllModelReferenceButtonsV46(panel);
mqEnsureNativeCloseButton(panel, 'model');
panel.style.display = 'block';
panel.style.opacity = '1';
panel.style.visibility = 'visible';
panel.style.pointerEvents = 'auto';
mqActiveModelPanel = panel;
}
finally {
mqModelEnhanceBusy = false;
}
};
function mqScheduleModelButtonsV46() {
var delays = [0, 80, 180, 350, 650, 1000, 1600];
for (var i = 0; i < delays.length; i++) {
(function (delay) {
window.setTimeout(function () {
if (!document.body.classList.contains('mq-model-form-open')) return;
var panel = findMediQModelFormPanel();
if (!panel) return;
mqUpdateAutoModelTitleV46(panel);
mqInjectAllModelReferenceButtonsV46(panel);
}, delay);
})(delays[i]);
}
}
var mqOriginalMountModelV46 = mqMountModelPanel;
mqMountModelPanel = function (panel) {
mqOriginalMountModelV46(panel);
mqScheduleModelButtonsV46();
};
/* Closing the MODEL also closes any child reference modal. */
var mqOriginalCloseModelV46 = closeMediQModelForm;
closeMediQModelForm = function () {
if (document.body.classList.contains('mq-reference-form-open-v46')) {
closeMediQReferenceFormV46();
}
mqOriginalCloseModelV46();
};
/* Closing the ASSET form closes child reference + model in the same click. */
var mqOriginalCloseAssetV46 = closeMediQAssetForm;
closeMediQAssetForm = function () {
if (document.body.classList.contains('mq-reference-form-open-v46')) {
closeMediQReferenceFormV46();
}
if (document.body.classList.contains('mq-model-form-open')) {
mqOriginalCloseModelV46();
}
mqOriginalCloseAssetV46();
};
/* Rebind direct onclick assignment done earlier in the script. */
(function mqRebindCloseButtonsV46() {
var assetClose = document.getElementById('mqCfClose');
if (assetClose) assetClose.onclick = closeMediQAssetForm;
var modelClose = document.getElementById('mqModelClose');
if (modelClose) modelClose.onclick = closeMediQModelForm;
})();
/* ESC: deepest open form closes first. */
document.addEventListener('keydown', function (e) {
if (e.key !== 'Escape') return;
if (document.body.classList.contains('mq-reference-form-open-v46')) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
closeMediQReferenceFormV46();
return;
}
if (document.body.classList.contains('mq-model-form-open')) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
closeMediQModelForm();
}
}, true);
/* Keep + buttons after Select2/ConfiForms redraws. */
document.addEventListener('input', function () {
if (!document.body.classList.contains('mq-model-form-open')) return;
mqScheduleModelButtonsV46();
}, true);
document.addEventListener('change', function () {
if (!document.body.classList.contains('mq-model-form-open')) return;
mqScheduleModelButtonsV46();
}, true);
try {
var mqV46Jq = (window.AJS && AJS.$) ? AJS.$ : (window.jQuery || null);
if (mqV46Jq) {
mqV46Jq(document)
.off('.mediqV46Refs')
.on(
'select2-selected.mediqV46Refs select2:select.mediqV46Refs select2-removed.mediqV46Refs select2:unselect.mediqV46Refs',
'input,select',
function () {
if (document.body.classList.contains('mq-model-form-open')) {
mqScheduleModelButtonsV46();
}
}
);
}
}
catch (ignoreV46Jq) {}
try {
var mqV46Observer = new MutationObserver(function () {
if (!document.body.classList.contains('mq-model-form-open')) return;
window.setTimeout(function () {
var panel = findMediQModelFormPanel();
if (!panel) return;
mqInjectAllModelReferenceButtonsV46(panel);
}, 20);
});
if (document.body) {
mqV46Observer.observe(document.body, { childList:true, subtree:true });
}
}
catch (ignoreV46Observer) {}
/* Child quick-create submit: close only the child, keep model + asset open. */
(function mqWrapSubmitFinishedV46() {
var previousSubmit = window.onCFSubmitFinished;
window.onCFSubmitFinished = function (formName) {
var isReference = false;
Object.keys(MQ_MODEL_REFERENCE_CFG).forEach(function (key) {
if (MQ_MODEL_REFERENCE_CFG[key].formName === formName) {
isReference = true;
}
});
if (isReference) {
closeMediQReferenceFormV46();
showToast('مقدار جدید ثبت شد؛ لیست فیلد مرجع بهروزرسانی میشود.');
mqScheduleModelButtonsV46();
return;
}
if (typeof previousSubmit === 'function') {
return previousSubmit.apply(this, arguments);
}
};
})();
/* ============================================================
MEDIQ V48 - CLEAN FORMS / FULL WIDTH SELECT2 / NESTED CLASSIFICATION
============================================================ */
function mqResetConfiFormV48(panel) {
if (!panel) return;
var form =
panel.querySelector('form.aui-confiforms') ||
panel.querySelector('form');
if (!form) return;
try { form.reset(); } catch (ignoreReset) {}
var controls = form.querySelectorAll(
'input:not([type="hidden"]), textarea, select'
);
for (var i = 0; i < controls.length; i++) {
var c = controls[i];
if (!c || c.disabled) continue;
var type = String(c.type || '').toLowerCase();
if (type === 'submit' || type === 'button' || type === 'reset') {
continue;
}
if (type === 'checkbox' || type === 'radio') {
c.checked = false;
}
else if (c.tagName === 'SELECT') {
try { c.selectedIndex = -1; } catch (ignoreSelectIndex) {}
try { c.value = ''; } catch (ignoreSelectValue) {}
}
else {
try { c.value = ''; } catch (ignoreValue) {}
}
try { c.dispatchEvent(new Event('input', { bubbles:true })); } catch (ignoreInput) {}
try { c.dispatchEvent(new Event('change', { bubbles:true })); } catch (ignoreChange) {}
}
/* ConfiForms/Select2 often stores the real selected value in a hidden input. */
var select2Controls = form.querySelectorAll(
'input.select2-offscreen, input.select2-hidden-accessible, ' +
'select.select2-offscreen, select.select2-hidden-accessible'
);
var jq =
(window.AJS && AJS.$)
? AJS.$
: (window.jQuery || null);
for (var j = 0; j < select2Controls.length; j++) {
var s = select2Controls[j];
try {
if (jq) {
try { jq(s).select2('val', ''); } catch (ignoreS2v3) {}
try { jq(s).val(null).trigger('change'); } catch (ignoreS2v4) {}
}
}
catch (ignoreSelect2) {}
try { s.value = ''; } catch (ignoreHiddenValue) {}
}
/* Hide stale validation/web-service banners from the previous opening. */
var stale = panel.querySelectorAll(
'.aui-message-error, .aui-message-warning, .confiforms-error, ' +
'.confiFormsError, .cf-error'
);
for (var k = 0; k < stale.length; k++) {
try { stale[k].style.display = 'none'; } catch (ignoreBanner) {}
}
}
/* ------------------------------------------------------------
Make model reference Select2 boxes always fill the control area.
------------------------------------------------------------ */
function mqRepairModelDropdownWidthsV48() {
if (!document.body.classList.contains('mq-model-form-open')) return;
var panel = findMediQModelFormPanel();
if (!panel) return;
var wraps = panel.querySelectorAll('.mq-reference-control-wrap-v46');
for (var i = 0; i < wraps.length; i++) {
var select2 = wraps[i].querySelector('.select2-container');
if (!select2) continue;
select2.style.setProperty('width', '100%', 'important');
select2.style.setProperty('max-width', '100%', 'important');
select2.style.setProperty('min-width', '0', 'important');
}
}
/* ------------------------------------------------------------
Reference quick-create form: always open blank.
------------------------------------------------------------ */
var mqOriginalMountReferenceV48 = mqMountReferencePanelV46;
mqMountReferencePanelV46 = function (panel, cfg, fieldName) {
mqResetConfiFormV48(panel);
var result = mqOriginalMountReferenceV48.apply(this, arguments);
window.setTimeout(function () {
mqInjectEquipmentTitleGroupPlusV48(panel, cfg);
}, 80);
return result;
};
var mqOriginalCloseReferenceV48 = closeMediQReferenceFormV46;
closeMediQReferenceFormV46 = function () {
if (document.body.classList.contains('mq-nested-reference-open-v48')) {
closeMediQNestedClassificationV48();
}
var active = mqReferenceActiveV46;
var panel = active && active.panel ? active.panel : null;
var result = mqOriginalCloseReferenceV48.apply(this, arguments);
window.setTimeout(function () {
mqResetConfiFormV48(panel);
}, 20);
return result;
};
/* ------------------------------------------------------------
Model form: every new opening starts blank.
Asset form stays open underneath after model save.
------------------------------------------------------------ */
var mqOriginalMountModelV48 = mqMountModelPanel;
mqMountModelPanel = function (panel) {
mqResetConfiFormV48(panel);
var result = mqOriginalMountModelV48.apply(this, arguments);
window.setTimeout(mqRepairModelDropdownWidthsV48, 0);
window.setTimeout(mqRepairModelDropdownWidthsV48, 120);
window.setTimeout(mqRepairModelDropdownWidthsV48, 350);
return result;
};
var mqOriginalCloseModelV48 = closeMediQModelForm;
closeMediQModelForm = function () {
if (document.body.classList.contains('mq-nested-reference-open-v48')) {
closeMediQNestedClassificationV48();
}
var panel = findMediQModelFormPanel();
var result = mqOriginalCloseModelV48.apply(this, arguments);
window.setTimeout(function () {
mqResetConfiFormV48(panel);
}, 20);
return result;
};
/* ------------------------------------------------------------
Asset form: if the user actually closes it and opens a new one,
the old values must not survive.
------------------------------------------------------------ */
var mqOriginalCloseAssetV48 = closeMediQAssetForm;
closeMediQAssetForm = function () {
if (document.body.classList.contains('mq-nested-reference-open-v48')) {
closeMediQNestedClassificationV48();
}
var panel = findMediQAssetFormPanel();
var result = mqOriginalCloseAssetV48.apply(this, arguments);
window.setTimeout(function () {
mqResetConfiFormV48(panel);
try { window.sessionStorage.removeItem('mediqAssetDraft'); } catch (ignoreDraft) {}
}, 20);
return result;
};
/* ============================================================
NESTED QUICK CREATE:
Equipment Title -> Group(Classification) [+]
============================================================ */
var mqNestedClassificationPanelV48 = null;
function mqFindClassificationPanelV48() {
var panel = mqFindConfiFormsRegistrationPanel('mediqNewClassification');
if (!panel) return null;
var asset = findMediQAssetFormPanel();
var model = findMediQModelFormPanel();
var parent = mqReferenceActiveV46 && mqReferenceActiveV46.panel
? mqReferenceActiveV46.panel
: null;
if (panel === asset || panel === model || panel === parent) return null;
return panel;
}
function mqEnsureNestedClassificationBackdropV48() {
var modal = document.getElementById('mqNestedReferenceModalV48');
if (modal) return modal;
modal = document.createElement('div');
modal.id = 'mqNestedReferenceModalV48';
modal.setAttribute('aria-hidden', 'true');
document.body.appendChild(modal);
modal.onclick = function (e) {
if (e.target === modal) closeMediQNestedClassificationV48();
};
return modal;
}
function mqEnsureNestedCloseV48(panel) {
if (!panel) return;
var title =
panel.querySelector('.confiFormsFormTitle') ||
panel.querySelector('.confiFormsFormContent');
if (!title || title.querySelector('.mq-native-nested-close-v48')) return;
var btn = document.createElement('button');
btn.type = 'button';
btn.className = 'mq-native-form-close mq-native-nested-close-v48';
btn.setAttribute('aria-label', 'بستن');
btn.setAttribute('title', 'بستن');
btn.textContent = '×';
btn.onclick = function (e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
closeMediQNestedClassificationV48();
return false;
};
title.appendChild(btn);
}
function mqMountNestedClassificationV48(panel) {
if (!panel) return;
mqResetConfiFormV48(panel);
var modal = mqEnsureNestedClassificationBackdropV48();
mqNestedClassificationPanelV48 = panel;
panel.classList.add('mq-nested-reference-panel-v48');
document.body.classList.add('mq-nested-reference-open-v48');
modal.classList.add('open');
modal.setAttribute('aria-hidden', 'false');
mqEnsureNestedCloseV48(panel);
panel.style.display = 'block';
panel.style.opacity = '1';
panel.style.visibility = 'visible';
panel.style.pointerEvents = 'auto';
window.setTimeout(function () {
mqEnsureNestedCloseV48(panel);
var first = panel.querySelector(
'input:not([type="hidden"]):not([disabled]), textarea:not([disabled]), select:not([disabled])'
);
if (first) first.focus();
}, 80);
}
function openMediQNestedClassificationV48() {
mqCloseSelect2Dropdowns(document);
var panel = mqFindClassificationPanelV48();
if (panel) {
mqMountNestedClassificationV48(panel);
return;
}
var control = mqFindRegistrationControl(
'mediqNewClassification',
'ثبت گروه جدید'
);
if (!control) {
showToast('ابتدا فرم mediqNewClassification و Registration Control آن را روی همین صفحه بسازید.');
return;
}
var clicked = mqClickRegistrationControl(control, 'ثبت گروه جدید');
if (!clicked) {
showToast('Registration Control فرم Classification اجرا نشد.');
return;
}
mqWaitForConfiFormsPanel(
mqFindClassificationPanelV48,
function (readyPanel) {
mqMountNestedClassificationV48(readyPanel);
},
function () {
showToast('ConfiForms فرم Classification را ایجاد نکرد.');
}
);
}
function closeMediQNestedClassificationV48() {
var modal = document.getElementById('mqNestedReferenceModalV48');
var panel = mqNestedClassificationPanelV48;
mqCloseSelect2Dropdowns(panel || document);
document.body.classList.remove('mq-nested-reference-open-v48');
if (modal) {
modal.classList.remove('open');
modal.setAttribute('aria-hidden', 'true');
}
if (panel) {
panel.classList.remove('mq-nested-reference-panel-v48');
}
mqNestedClassificationPanelV48 = null;
window.setTimeout(function () {
mqResetConfiFormV48(panel);
var active = mqReferenceActiveV46;
if (active && active.panel) {
mqInjectEquipmentTitleGroupPlusV48(active.panel, active.cfg);
}
}, 30);
}
function mqInjectEquipmentTitleGroupPlusV48(panel, cfg) {
if (!panel || !cfg || cfg.formName !== 'mediqNewEquipmentTitle') return;
var form =
panel.querySelector('form.aui-confiforms') ||
panel.querySelector('form');
if (!form) return;
if (form.querySelector('.mq-equipment-title-group-plus-v48')) return;
var field = mqFindNamedField(form, 'equipmentTitleGroup');
if (!field) return;
var visual = mqReferenceVisualV46(form, field);
if (!visual) return;
var cell =
(visual.closest && visual.closest('td')) ||
(field.closest && field.closest('td')) ||
(field.closest && field.closest('.field-group')) ||
visual.parentElement;
if (!cell) return;
var wrap = document.createElement('div');
wrap.className = 'mq-nested-ref-wrap-v48';
if (visual.parentNode) {
visual.parentNode.insertBefore(wrap, visual);
wrap.appendChild(visual);
}
else {
cell.appendChild(wrap);
}
var btn = document.createElement('button');
btn.type = 'button';
btn.className = 'mq-reference-plus-v46 mq-equipment-title-group-plus-v48';
btn.setAttribute('title', 'ثبت گروه جدید');
btn.setAttribute('aria-label', 'ثبت گروه جدید');
btn.textContent = '+';
btn.onclick = function (e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
openMediQNestedClassificationV48();
return false;
};
wrap.appendChild(btn);
var select2 = wrap.querySelector('.select2-container');
if (select2) {
select2.style.setProperty('width', '100%', 'important');
select2.style.setProperty('max-width', '100%', 'important');
select2.style.setProperty('min-width', '0', 'important');
}
}
/* ------------------------------------------------------------
Existing reference modal redraw may recreate the Equipment Title
picker, therefore re-inject its nested + when required.
------------------------------------------------------------ */
document.addEventListener('change', function () {
window.setTimeout(mqRepairModelDropdownWidthsV48, 0);
window.setTimeout(mqRepairModelDropdownWidthsV48, 120);
var active = mqReferenceActiveV46;
if (active && active.panel) {
window.setTimeout(function () {
mqInjectEquipmentTitleGroupPlusV48(active.panel, active.cfg);
}, 80);
}
}, true);
try {
var mqV48Observer = new MutationObserver(function () {
if (document.body.classList.contains('mq-model-form-open')) {
window.setTimeout(mqRepairModelDropdownWidthsV48, 20);
}
var active = mqReferenceActiveV46;
if (active && active.panel) {
window.setTimeout(function () {
mqInjectEquipmentTitleGroupPlusV48(active.panel, active.cfg);
}, 30);
}
});
if (document.body) {
mqV48Observer.observe(document.body, { childList:true, subtree:true });
}
}
catch (ignoreV48Observer) {}
/* ------------------------------------------------------------
If Classification was created from INSIDE Equipment Title,
close only the nested Classification form. Keep Equipment Title,
Model and Asset forms open.
------------------------------------------------------------ */
(function mqWrapNestedClassificationSubmitV48() {
var previousSubmitV48 = window.onCFSubmitFinished;
window.onCFSubmitFinished = function (formName) {
if (
formName === 'mediqNewClassification' &&
document.body.classList.contains('mq-nested-reference-open-v48')
) {
closeMediQNestedClassificationV48();
showToast('گروه جدید ثبت شد؛ فرم عنوان دستگاه باز مانده است.');
return;
}
if (typeof previousSubmitV48 === 'function') {
return previousSubmitV48.apply(this, arguments);
}
};
})();
/* Final close-button binding must point to V48 wrappers. */
(function mqRebindCloseButtonsV48() {
var assetClose = document.getElementById('mqCfClose');
if (assetClose) assetClose.onclick = closeMediQAssetForm;
var modelClose = document.getElementById('mqModelClose');
if (modelClose) modelClose.onclick = closeMediQModelForm;
})();
/* ============================================================
MEDIQ V50 - TOP-DOWN REGISTRATION FLOW
Classification -> Equipment Title -> Model -> Equipment
Uses the existing ConfiForms; no nested form stack.
============================================================ */
var mqFlowStateV50 = {
open: false,
step: 1,
mode: "selector",
activePanel: null,
initialized: {}
};
var MQ_FLOW_CFG_V50 = {
classification: {
formName: "mediqNewClassification",
buttonText: "ثبت گروه جدید",
title: "ثبت طبقهبندی جدید"
},
equipmentTitle: {
formName: "mediqNewEquipmentTitle",
buttonText: "ثبت عنوان دستگاه جدید",
title: "ثبت عنوان دستگاه جدید"
},
model: {
formName: "mediqNewModel",
buttonText: "ثبت مدل جدید",
title: "ثبت مدل جدید"
},
asset: {
formName: "mediqNewAsset",
buttonText: "ثبت دارایی جدید",
title: "ثبت دارایی جدید"
}
};
function mqFlowGetPanelV50(key) {
if (key === "classification") {
return mqFindConfiFormsPanelByFields(
["classificationName", "classificationParent"],
1
) || mqFindConfiFormsRegistrationPanel("mediqNewClassification");
}
if (key === "equipmentTitle") {
return mqFindConfiFormsPanelByFields(
["equipmentTitleGroup", "equipmentTitleName"],
2
) || mqFindConfiFormsRegistrationPanel("mediqNewEquipmentTitle");
}
if (key === "model") {
return findMediQModelFormPanel();
}
if (key === "asset") {
return findMediQAssetFormPanel();
}
return null;
}
function mqFlowEnsurePanelV50(key, onReady) {
var cfg = MQ_FLOW_CFG_V50[key];
if (!cfg) return;
var panel = mqFlowGetPanelV50(key);
if (panel) {
onReady(panel);
return;
}
var control = mqFindRegistrationControl(cfg.formName, cfg.buttonText);
if (!control) {
showToast("Registration Control فرم «" + cfg.formName + "» روی صفحه پیدا نشد.");
return;
}
if (!mqClickRegistrationControl(control, cfg.buttonText)) {
showToast("Registration Control فرم «" + cfg.formName + "» اجرا نشد.");
return;
}
mqWaitForConfiFormsPanel(
function () { return mqFlowGetPanelV50(key); },
function (readyPanel) { onReady(readyPanel); },
function () {
showToast("ConfiForms فرم «" + cfg.formName + "» را ایجاد نکرد.");
}
);
}
function mqFlowGetFormV50(panel) {
if (!panel) return null;
return panel.querySelector("form.aui-confiforms") || panel.querySelector("form");
}
function mqFlowRemoveUiV50(panel) {
if (!panel) return;
var generated = panel.querySelectorAll(
".mq-flow-head-v50, .mq-flow-footer-v50, .mq-flow-create-actions-v50"
);
for (var i = 0; i < generated.length; i++) {
generated[i].parentNode && generated[i].parentNode.removeChild(generated[i]);
}
var rows = panel.querySelectorAll(".mq-flow-hidden-row-v50");
for (var r = 0; r < rows.length; r++) {
rows[r].classList.remove("mq-flow-hidden-row-v50");
}
panel.classList.remove("mq-flow-selector-v50");
panel.classList.remove("mq-flow-create-v50");
panel.classList.remove("mq-flow-asset-v50");
panel.classList.remove("mq-flow-active-panel-v50");
}
function mqFlowDeactivateCurrentV50() {
if (!mqFlowStateV50.activePanel) return;
mqCloseSelect2Dropdowns(mqFlowStateV50.activePanel);
mqFlowStateV50.activePanel.classList.remove("mq-flow-active-panel-v50");
mqFlowStateV50.activePanel = null;
}
function mqFlowActivateV50(panel) {
if (!panel) return;
mqFlowDeactivateCurrentV50();
panel.classList.add("mq-flow-active-panel-v50");
panel.style.display = "block";
panel.style.opacity = "1";
panel.style.visibility = "visible";
panel.style.pointerEvents = "auto";
mqFlowStateV50.activePanel = panel;
}
function mqFlowStepTitleV50(step) {
return [
"",
"طبقهبندی",
"عنوان دستگاه",
"مدل دستگاه",
"ثبت دارایی"
][step] || "ثبت دارایی";
}
function mqFlowBuildHeadV50(panel, step, title, subtitle) {
if (!panel) return;
var old = panel.querySelector(".mq-flow-head-v50");
if (old) old.parentNode.removeChild(old);
var head = document.createElement("div");
head.className = "mq-flow-head-v50";
var steps = "";
var labels = ["طبقهبندی", "عنوان دستگاه", "مدل", "دارایی"];
for (var i = 1; i <= 4; i++) {
var cls = "mq-flow-step-v50";
if (i < step) cls += " done";
if (i === step) cls += " active";
steps +=
'<div class="' + cls + '">' +
'<span class="mq-flow-step-num-v50">' + i + '</span>' +
'<span>' + labels[i - 1] + '</span>' +
'</div>';
}
head.innerHTML =
'<div class="mq-flow-head-top-v50">' +
'<div>' +
'<div class="mq-flow-title-v50">' + title + '</div>' +
'<div class="mq-flow-subtitle-v50">' + (subtitle || "") + '</div>' +
'</div>' +
'<button type="button" class="mq-flow-close-v50" aria-label="بستن">×</button>' +
'</div>' +
'<div class="mq-flow-steps-v50">' + steps + '</div>';
panel.insertBefore(head, panel.firstChild);
var close = head.querySelector(".mq-flow-close-v50");
if (close) {
close.onclick = function (e) {
e.preventDefault();
e.stopPropagation();
mqCloseRegistrationFlowV50(true);
};
}
}
function mqFlowFindFieldV50(panel, fieldName) {
var form = mqFlowGetFormV50(panel);
if (!form) return null;
return mqFindNamedField(form, fieldName) ||
mqFindModelFieldV46(form, fieldName, MQ_FORM_LABELS[fieldName] || "");
}
function mqFlowFieldRowV50(panel, fieldName) {
var form = mqFlowGetFormV50(panel);
if (!form) return null;
var field = mqFlowFindFieldV50(panel, fieldName);
if (!field) return null;
return (
(field.closest && field.closest("tr")) ||
(field.closest && field.closest(".field-group")) ||
(field.closest && field.closest(".control-group")) ||
field.parentElement
);
}
function mqFlowSetLabelV50(panel, fieldName, text) {
var form = mqFlowGetFormV50(panel);
var field = mqFlowFindFieldV50(panel, fieldName);
if (!form || !field) return;
var id = field.getAttribute && field.getAttribute("id");
var label = id ? form.querySelector('label[for="' + id + '"]') : null;
var row = mqFlowFieldRowV50(panel, fieldName);
if (!label && row) label = row.querySelector("label");
if (!label) return;
var required = label.querySelector(".aui-iconfont-required, .required, .cf_required");
if (required) {
label.innerHTML = "";
label.appendChild(document.createTextNode(text + " "));
label.appendChild(required);
}
else {
label.textContent = text;
}
}
function mqFlowHideAllRowsExceptV50(panel, fieldName) {
var form = mqFlowGetFormV50(panel);
if (!form) return;
var rows = form.querySelectorAll("tr, .field-group, .control-group");
for (var i = 0; i < rows.length; i++) {
rows[i].classList.add("mq-flow-hidden-row-v50");
}
var target = mqFlowFieldRowV50(panel, fieldName);
if (target) target.classList.remove("mq-flow-hidden-row-v50");
}
function mqFlowShowAllRowsV50(panel) {
if (!panel) return;
var rows = panel.querySelectorAll(".mq-flow-hidden-row-v50");
for (var i = 0; i < rows.length; i++) {
rows[i].classList.remove("mq-flow-hidden-row-v50");
}
}
function mqFlowSelectedTextV50(panel, fieldName) {
var field = mqFlowFindFieldV50(panel, fieldName);
if (!field) return "";
var row = mqFlowFieldRowV50(panel, fieldName);
if (row) {
var rendered = row.querySelector(
".select2-chosen, .select2-selection__rendered, .aui-select2-choice .select2-chosen"
);
if (rendered) {
var txt = mqNormalizeTextV46(rendered.textContent || "")
.replace(/^×\s*/, "")
.trim();
if (
txt &&
txt !== "انتخاب کنید" &&
txt !== "Select" &&
txt !== "Choose"
) {
return txt;
}
}
}
return mqNormalizeTextV46(field.value || "");
}
function mqFlowHasSelectionV50(panel, fieldName) {
var field = mqFlowFindFieldV50(panel, fieldName);
if (!field) return false;
var value = mqNormalizeTextV46(field.value || "");
if (value) return true;
return !!mqFlowSelectedTextV50(panel, fieldName);
}
function mqFlowClearExceptV50(panel, keepNames) {
var form = mqFlowGetFormV50(panel);
if (!form) return;
var keep = {};
(keepNames || []).forEach(function (n) { keep[n] = true; });
var controls = form.querySelectorAll("input[name], textarea[name], select[name]");
for (var i = 0; i < controls.length; i++) {
var c = controls[i];
var name = c.name || "";
if (!name || keep[name] || c.type === "hidden" || c.type === "submit" || c.type === "button") {
continue;
}
if (c.type === "checkbox" || c.type === "radio") {
c.checked = false;
}
else {
c.value = "";
}
try {
if (window.AJS && AJS.$) {
var $c = AJS.$(c);
if ($c.data("select2") || $c.hasClass("select2-offscreen") || $c.hasClass("select2-hidden-accessible")) {
try { $c.select2("val", ""); } catch (ignoreS2v) {}
try { $c.trigger("change"); } catch (ignoreS2c) {}
}
}
}
catch (ignore) {}
}
}
function mqFlowRefreshReferenceV50(panel, fieldName) {
var field = mqFlowFindFieldV50(panel, fieldName);
if (!field) return;
try {
var jq = (window.AJS && AJS.$) ? AJS.$ : (window.jQuery || null);
if (!jq) return;
var $field = jq(field);
try { $field.select2("close"); } catch (ignore1) {}
try { $field.trigger("change"); } catch (ignore2) {}
}
catch (ignore) {}
}
function mqFlowBuildSelectorFooterV50(panel, opts) {
var old = panel.querySelector(".mq-flow-footer-v50");
if (old) old.parentNode.removeChild(old);
var footer = document.createElement("div");
footer.className = "mq-flow-footer-v50";
footer.innerHTML =
'<div class="mq-flow-footer-right-v50">' +
'<button type="button" class="mq-flow-plus-v50">+ ثبت ' + opts.plusLabel + ' جدید</button>' +
'</div>' +
'<div class="mq-flow-footer-left-v50">' +
(opts.backStep
? '<button type="button" class="mq-flow-secondary-v50 mq-flow-back-v50">مرحله قبل</button>'
: '') +
'<button type="button" class="mq-flow-primary-v50 mq-flow-next-v50">مرحله بعد</button>' +
'</div>';
panel.appendChild(footer);
var plus = footer.querySelector(".mq-flow-plus-v50");
var next = footer.querySelector(".mq-flow-next-v50");
var back = footer.querySelector(".mq-flow-back-v50");
if (plus) plus.onclick = opts.onPlus;
if (next) next.onclick = opts.onNext;
if (back) back.onclick = function () { mqFlowShowSelectorStepV50(opts.backStep); };
}
function mqFlowBuildCreateBackV50(panel, stepBack) {
var old = panel.querySelector(".mq-flow-create-actions-v50");
if (old) old.parentNode.removeChild(old);
var bar = document.createElement("div");
bar.className = "mq-flow-create-actions-v50";
bar.innerHTML =
'<button type="button" class="mq-flow-secondary-v50">بازگشت بدون ثبت</button>';
panel.appendChild(bar);
var btn = bar.querySelector("button");
if (btn) btn.onclick = function () { mqFlowShowSelectorStepV50(stepBack); };
}
function mqFlowPrepareSelectorPanelV50(panel, step, fieldName, title, subtitle, labelText, plusLabel, createKey, nextStep, backStep) {
mqFlowRemoveUiV50(panel);
mqFlowActivateV50(panel);
panel.classList.add("mq-flow-selector-v50");
mqFlowBuildHeadV50(panel, step, title, subtitle);
mqFlowHideAllRowsExceptV50(panel, fieldName);
mqFlowSetLabelV50(panel, fieldName, labelText);
mqFlowBuildSelectorFooterV50(panel, {
plusLabel: plusLabel,
backStep: backStep,
onPlus: function () {
mqFlowShowCreateV50(createKey, step);
},
onNext: function () {
if (!mqFlowHasSelectionV50(panel, fieldName)) {
showToast("ابتدا «" + labelText + "» را انتخاب کنید.");
return;
}
mqFlowShowSelectorStepV50(nextStep);
}
});
var field = mqFlowFindFieldV50(panel, fieldName);
if (field) {
window.setTimeout(function () {
var visual = mqReferenceVisualV46(mqFlowGetFormV50(panel), field);
if (visual && visual.focus) visual.focus();
}, 60);
}
}
function mqFlowShowSelectorStepV50(step) {
if (!mqFlowStateV50.open) return;
mqFlowStateV50.step = step;
mqFlowStateV50.mode = "selector";
if (step === 1) {
mqFlowEnsurePanelV50("equipmentTitle", function (panel) {
if (!mqFlowStateV50.initialized.equipmentTitle) {
mqResetConfiFormV48(panel);
mqFlowStateV50.initialized.equipmentTitle = true;
}
mqFlowPrepareSelectorPanelV50(
panel,
1,
"equipmentTitleGroup",
"انتخاب طبقهبندی",
"طبقهبندی موجود را انتخاب کنید؛ اگر وجود ندارد، از دکمه + آن را ثبت کنید.",
"طبقهبندی",
"طبقهبندی",
"classification",
2,
0
);
});
return;
}
if (step === 2) {
mqFlowEnsurePanelV50("model", function (panel) {
if (!mqFlowStateV50.initialized.model) {
mqResetConfiFormV48(panel);
mqFlowStateV50.initialized.model = true;
}
mqFlowPrepareSelectorPanelV50(
panel,
2,
"deviceTitle",
"انتخاب عنوان دستگاه",
"عنوان دستگاه موجود را انتخاب کنید؛ اگر وجود ندارد، از دکمه + آن را ثبت کنید.",
"عنوان دستگاه",
"عنوان دستگاه",
"equipmentTitle",
3,
1
);
});
return;
}
if (step === 3) {
mqFlowEnsurePanelV50("asset", function (panel) {
if (!mqFlowStateV50.initialized.asset) {
mqResetConfiFormV48(panel);
mqFlowStateV50.initialized.asset = true;
}
mqFlowPrepareSelectorPanelV50(
panel,
3,
"deviceModel",
"انتخاب مدل دستگاه",
"مدل موجود را انتخاب کنید؛ اگر وجود ندارد، از دکمه + مدل جدید را ثبت کنید.",
"مدل دستگاه",
"مدل",
"model",
4,
2
);
});
return;
}
if (step === 4) {
mqFlowShowAssetCreateV50();
}
}
function mqFlowShowCreateV50(key, returnStep) {
if (!mqFlowStateV50.open) return;
mqFlowStateV50.mode = "create-" + key;
mqFlowEnsurePanelV50(key, function (panel) {
mqFlowRemoveUiV50(panel);
mqFlowActivateV50(panel);
panel.classList.add("mq-flow-create-v50");
if (key === "classification") {
mqResetConfiFormV48(panel);
mqFlowBuildHeadV50(
panel,
1,
"ثبت طبقهبندی جدید",
"اطلاعات طبقهبندی را وارد و ثبت کنید؛ سپس به انتخاب طبقهبندی برمیگردید."
);
}
else if (key === "equipmentTitle") {
/* Keep the Classification selected in equipmentTitleGroup. */
mqFlowClearExceptV50(panel, ["equipmentTitleGroup"]);
mqFlowBuildHeadV50(
panel,
2,
"ثبت عنوان دستگاه جدید",
"طبقهبندی انتخابشده حفظ میشود؛ عنوان دستگاه را تکمیل و ثبت کنید."
);
}
else if (key === "model") {
/* Keep the Equipment Title selected in deviceTitle. */
mqFlowClearExceptV50(panel, ["deviceTitle"]);
try { mqEnhanceLiveModelPanel(panel); } catch (ignoreEnhanceModelV50) {}
mqFlowBuildHeadV50(
panel,
3,
"ثبت مدل جدید",
"عنوان دستگاه انتخابشده حفظ میشود؛ مشخصات مدل را تکمیل و ثبت کنید."
);
}
mqFlowShowAllRowsV50(panel);
mqFlowBuildCreateBackV50(panel, returnStep);
});
}
function mqFlowShowAssetCreateV50() {
mqFlowEnsurePanelV50("asset", function (panel) {
mqFlowStateV50.step = 4;
mqFlowStateV50.mode = "asset";
mqFlowRemoveUiV50(panel);
mqFlowActivateV50(panel);
panel.classList.add("mq-flow-asset-v50");
try { mqEnhanceLiveAssetPanel(panel); } catch (ignoreEnhanceAssetV50) {}
mqFlowShowAllRowsV50(panel);
mqFlowBuildHeadV50(
panel,
4,
"ثبت دارایی",
"مدل انتخاب شده است؛ اطلاعات نهایی دارایی را تکمیل و ثبت کنید."
);
mqFlowBuildCreateBackV50(panel, 3);
});
}
function mqEnsureRegistrationFlowBackdropV50() {
var backdrop = document.getElementById("mqRegistrationFlowBackdropV50");
if (backdrop) return backdrop;
backdrop = document.createElement("div");
backdrop.id = "mqRegistrationFlowBackdropV50";
backdrop.setAttribute("aria-hidden", "true");
document.body.appendChild(backdrop);
return backdrop;
}
function openMediQRegistrationFlowV50() {
if (mqFlowStateV50.open) return;
mqFlowStateV50.open = true;
mqFlowStateV50.step = 1;
mqFlowStateV50.mode = "selector";
mqFlowStateV50.activePanel = null;
mqFlowStateV50.initialized = {};
try {
window.sessionStorage.removeItem("mediqAssetDraft");
window.sessionStorage.removeItem("mediqOpenAssetAfterReload");
} catch (ignore) {}
mqCloseSelect2Dropdowns(document);
document.body.classList.add("mq-flow-open-v50");
var backdrop = mqEnsureRegistrationFlowBackdropV50();
backdrop.classList.add("open");
backdrop.setAttribute("aria-hidden", "false");
mqFlowShowSelectorStepV50(1);
}
function mqCloseRegistrationFlowV50(resetAll) {
mqCloseSelect2Dropdowns(document);
var keys = ["classification", "equipmentTitle", "model", "asset"];
for (var i = 0; i < keys.length; i++) {
var panel = mqFlowGetPanelV50(keys[i]);
if (!panel) continue;
mqFlowRemoveUiV50(panel);
if (resetAll) {
try { mqResetConfiFormV48(panel); } catch (ignoreResetV50) {}
}
}
mqFlowDeactivateCurrentV50();
var backdrop = document.getElementById("mqRegistrationFlowBackdropV50");
if (backdrop) {
backdrop.classList.remove("open");
backdrop.setAttribute("aria-hidden", "true");
}
document.body.classList.remove("mq-flow-open-v50");
mqFlowStateV50.open = false;
mqFlowStateV50.step = 1;
mqFlowStateV50.mode = "selector";
mqFlowStateV50.activePanel = null;
mqFlowStateV50.initialized = {};
}
/* Replace the old bottom-up asset opener with the new top-down flow. */
var mqLegacyOpenAssetV50 = openMediQAssetForm;
openMediQAssetForm = function () {
openMediQRegistrationFlowV50();
};
/* Final ConfiForms callback for the top-down flow. */
(function mqBindTopDownSubmitV50() {
var previousSubmitV50 = window.onCFSubmitFinished;
window.onCFSubmitFinished = function (formName) {
if (mqFlowStateV50.open) {
if (formName === "mediqNewClassification") {
showToast("طبقهبندی ثبت شد؛ آن را از لیست انتخاب کنید.");
mqFlowShowSelectorStepV50(1);
window.setTimeout(function () {
var p = mqFlowGetPanelV50("equipmentTitle");
if (p) mqFlowRefreshReferenceV50(p, "equipmentTitleGroup");
}, 180);
return;
}
if (formName === "mediqNewEquipmentTitle") {
showToast("عنوان دستگاه ثبت شد؛ آن را از لیست انتخاب کنید.");
mqFlowShowSelectorStepV50(2);
window.setTimeout(function () {
var p = mqFlowGetPanelV50("model");
if (p) mqFlowRefreshReferenceV50(p, "deviceTitle");
}, 180);
return;
}
if (formName === "mediqNewModel") {
showToast("مدل ثبت شد؛ آن را از لیست انتخاب کنید.");
mqFlowShowSelectorStepV50(3);
window.setTimeout(function () {
var p = mqFlowGetPanelV50("asset");
if (p) mqFlowRefreshReferenceV50(p, "deviceModel");
}, 180);
return;
}
if (formName === "mediqNewAsset") {
try {
window.sessionStorage.setItem("mediqResumeView", "newAsset-purchased");
} catch (ignoreResumeV50) {}
mqCloseRegistrationFlowV50(true);
showToast("دارایی با موفقیت ثبت شد.");
window.setTimeout(function () {
window.location.reload();
}, 450);
return;
}
}
if (typeof previousSubmitV50 === "function") {
return previousSubmitV50.apply(this, arguments);
}
};
})();
/* ESC closes the whole top-down flow. */
document.addEventListener("keydown", function (e) {
if (e.key !== "Escape") return;
if (!mqFlowStateV50.open) return;
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
mqCloseRegistrationFlowV50(true);
}, true);
/* ============================================================
INITIAL
============================================================ */
bindTree();
var mqResumeView = "";
try {
mqResumeView = window.sessionStorage.getItem("mediqResumeView") || "";
if (mqResumeView) {
window.sessionStorage.removeItem("mediqResumeView");
}
} catch (e) {}
if (mqResumeView === "newAsset-purchased") {
state.selectedAssetSection = "purchased";
renderAssetSections("newAsset");
var mqOpenAssetAfterReload = false;
try {
mqOpenAssetAfterReload = window.sessionStorage.getItem("mediqOpenAssetAfterReload") === "1";
if (mqOpenAssetAfterReload) window.sessionStorage.removeItem("mediqOpenAssetAfterReload");
} catch (ignoreOpen) {}
if (mqOpenAssetAfterReload) {
window.setTimeout(function () { openMediQAssetForm(); }, 500);
}
} else if (mqResumeView === "editAsset") {
renderEditAssetWorkspace();
} else {
renderEquipment();
}
})();
</script>
</div>
<style id="mq-v41-safe-polish">
/* ============================================================
V41 - PRESENTATION SAFE POLISH
Visual-only changes. Form opener / IFTTT / endpoints untouched.
============================================================ */
/* ---------- Asset form ---------- */
body.mq-asset-form-open .cf_mediqNewAsset{
width:min(900px,94vw) !important;
max-width:94vw !important;
border-radius:22px !important;
border:1px solid #dbe9ef !important;
box-shadow:0 30px 90px rgba(3,35,55,.30) !important;
background:#fff !important;
}
body.mq-asset-form-open .cf_mediqNewAsset .confiFormsFormContent{
padding:14px 22px 8px !important;
background:#fff !important;
}
body.mq-asset-form-open .cf_mediqNewAsset table{
width:100% !important;
border-collapse:separate !important;
border-spacing:0 7px !important;
direction:rtl !important;
}
body.mq-asset-form-open .cf_mediqNewAsset tr:not(.mq-form-section-row) > td{
padding:5px 7px !important;
border:0 !important;
background:transparent !important;
vertical-align:middle !important;
}
/* Label column on the RIGHT */
body.mq-asset-form-open .cf_mediqNewAsset tr:not(.mq-form-section-row) > td:first-child{
width:190px !important;
min-width:190px !important;
color:#123e58 !important;
font-size:12px !important;
font-weight:800 !important;
text-align:right !important;
white-space:nowrap !important;
}
/* Input side: white card, soft border */
body.mq-asset-form-open .cf_mediqNewAsset tr:not(.mq-form-section-row) > td:last-child{
background:#fff !important;
border:1px solid #dce8ee !important;
border-radius:11px !important;
padding:5px !important;
box-shadow:0 4px 14px rgba(17,62,88,.035) !important;
}
body.mq-asset-form-open .cf_mediqNewAsset input[type="text"],
body.mq-asset-form-open .cf_mediqNewAsset input[type="password"],
body.mq-asset-form-open .cf_mediqNewAsset input[type="date"],
body.mq-asset-form-open .cf_mediqNewAsset textarea,
body.mq-asset-form-open .cf_mediqNewAsset select{
width:100% !important;
min-height:38px !important;
box-sizing:border-box !important;
border:0 !important;
border-radius:8px !important;
background:#fff !important;
color:#163f58 !important;
box-shadow:none !important;
outline:none !important;
padding:0 10px !important;
direction:rtl !important;
text-align:right !important;
font-family:inherit !important;
font-size:12px !important;
}
body.mq-asset-form-open .cf_mediqNewAsset textarea{
min-height:76px !important;
padding-top:9px !important;
}
body.mq-asset-form-open .cf_mediqNewAsset tr:not(.mq-form-section-row) > td:last-child:focus-within{
border-color:#17b7af !important;
box-shadow:0 0 0 3px rgba(23,183,175,.10) !important;
}
/* Section headers */
body.mq-asset-form-open .cf_mediqNewAsset .mq-form-section-row > td{
border:0 !important;
background:transparent !important;
padding:11px 2px 2px !important;
}
body.mq-asset-form-open .cf_mediqNewAsset .mq-form-section-title{
color:#0c405b !important;
font-size:13px !important;
font-weight:900 !important;
padding:0 0 9px !important;
border-bottom:1px solid #e2edf1 !important;
}
/* Model select: remove ugly grey strip */
body.mq-asset-form-open .cf_mediqNewAsset .select2-container,
body.mq-asset-form-open .cf_mediqNewAsset .select2-choice,
body.mq-asset-form-open .cf_mediqNewAsset .select2-selection,
body.mq-asset-form-open .cf_mediqNewAsset .select2-selection--single{
background:#fff !important;
background-image:none !important;
border-color:#dce8ee !important;
box-shadow:none !important;
border-radius:8px !important;
}
body.mq-asset-form-open .cf_mediqNewAsset .mq-model-plus{
width:38px !important;
height:38px !important;
min-width:38px !important;
border-radius:10px !important;
border:1px solid rgba(8,185,176,.38) !important;
background:#ecfbfa !important;
color:#07958f !important;
font-size:22px !important;
font-weight:700 !important;
box-shadow:none !important;
}
body.mq-asset-form-open .cf_mediqNewAsset .save-cf-btn{
min-width:135px !important;
height:40px !important;
border-radius:10px !important;
border:0 !important;
background:linear-gradient(90deg,#079f99,#0abbb2) !important;
color:#fff !important;
font-weight:900 !important;
box-shadow:0 10px 24px rgba(10,187,178,.18) !important;
}
/* ---------- Purchased asset list ---------- */
#mediq-dashboard .mq-assets-host{
margin-top:14px !important;
}
#mediq-dashboard .mq-assets-host > table,
#mediq-dashboard .mq-assets-host table{
border-collapse:separate !important;
border-spacing:0 !important;
border:1px solid #dce9ef !important;
border-radius:14px !important;
overflow:hidden !important;
box-shadow:0 8px 26px rgba(17,62,88,.035) !important;
}
#mediq-dashboard .mq-assets-host thead th,
#mediq-dashboard .mq-assets-host th{
background:#f5f9fb !important;
color:#16435e !important;
padding:14px 16px !important;
font-size:12px !important;
font-weight:900 !important;
border-bottom:1px solid #dce9ef !important;
}
#mediq-dashboard .mq-assets-host tbody td,
#mediq-dashboard .mq-assets-host td{
background:#fff !important;
color:#294f68 !important;
padding:13px 16px !important;
border-bottom:1px solid #eef3f5 !important;
}
#mediq-dashboard .mq-assets-host tbody tr:last-child td{
border-bottom:0 !important;
}
#mediq-dashboard .mq-assets-host tbody tr:hover td{
background:#fbfefe !important;
}
/* Never show a date-picker/calendar as the asset list. */
#mediq-dashboard .mq-assets-host .ui-datepicker,
#mediq-dashboard .mq-assets-host .aui-datepicker,
#mediq-dashboard .mq-assets-host [class*="datepicker"],
#mediq-dashboard .mq-assets-host [class*="calendar"]{
display:none !important;
}
/* Actual date picker must stay above the modal when opened. */
#ui-datepicker-div,
.ui-datepicker,
.aui-datepicker,
.aui-datepicker-dialog,
[class*="datepicker-popup"]{
z-index:10250 !important;
}
</style>
<style id="mq-v42-rtl-soft-forms">
/* ============================================================
V42 - RTL + SOFT MODEL FORM + GREEN SUBMIT BUTTONS
Visual-only override. No ConfiForms/Assets logic changed.
============================================================ */
/* ---------- RTL: both MediQ modal forms + native ConfiForms dialogs ---------- */
#mqCfModal,
#mqCfDialog,
#mqCfBody,
#mqCfBody .confiFormsFormBorder,
#mqCfBody .confiFormsFormContent,
#mqCfBody form,
#mqCfBody table,
#mqModelModal,
#mqModelDialog,
#mqModelBody,
#mqModelBody .confiFormsFormBorder,
#mqModelBody .confiFormsFormContent,
#mqModelBody form,
#mqModelBody table,
.confiFormsFormBorder.cf_mediqNewAsset,
.confiFormsFormBorder.cf_mediqNewModel,
.confiFormsFormBorder.cf_mediqNewAsset form,
.confiFormsFormBorder.cf_mediqNewModel form,
.confiFormsFormBorder.cf_mediqNewAsset table,
.confiFormsFormBorder.cf_mediqNewModel table {
direction: rtl !important;
text-align: right !important;
}
/* AUI/ConfiForms dialog that may be created outside our custom wrapper */
body.mq-asset-form-open .aui-dialog,
body.mq-asset-form-open .aui-dialog2,
body.mq-asset-form-open .aui-dialog-content,
body.mq-model-form-open .aui-dialog,
body.mq-model-form-open .aui-dialog2,
body.mq-model-form-open .aui-dialog-content {
direction: rtl !important;
text-align: right !important;
}
/* labels always on the right and aligned */
#mqCfBody td,
#mqModelBody td,
.confiFormsFormBorder.cf_mediqNewAsset td,
.confiFormsFormBorder.cf_mediqNewModel td {
text-align: right !important;
direction: rtl !important;
vertical-align: middle !important;
}
#mqCfBody label,
#mqModelBody label,
.confiFormsFormBorder.cf_mediqNewAsset label,
.confiFormsFormBorder.cf_mediqNewModel label {
display: inline-block !important;
direction: rtl !important;
text-align: right !important;
color: #173b59 !important;
font-weight: 800 !important;
}
/* ---------- softer white controls in BOTH forms ---------- */
#mqCfBody input[type="text"],
#mqCfBody input[type="password"],
#mqCfBody input[type="date"],
#mqCfBody input[type="number"],
#mqCfBody textarea,
#mqCfBody select,
#mqModelBody input[type="text"],
#mqModelBody input[type="password"],
#mqModelBody input[type="date"],
#mqModelBody input[type="number"],
#mqModelBody textarea,
#mqModelBody select,
.confiFormsFormBorder.cf_mediqNewAsset input[type="text"],
.confiFormsFormBorder.cf_mediqNewAsset input[type="password"],
.confiFormsFormBorder.cf_mediqNewAsset input[type="date"],
.confiFormsFormBorder.cf_mediqNewAsset input[type="number"],
.confiFormsFormBorder.cf_mediqNewAsset textarea,
.confiFormsFormBorder.cf_mediqNewAsset select,
.confiFormsFormBorder.cf_mediqNewModel input[type="text"],
.confiFormsFormBorder.cf_mediqNewModel input[type="password"],
.confiFormsFormBorder.cf_mediqNewModel input[type="date"],
.confiFormsFormBorder.cf_mediqNewModel input[type="number"],
.confiFormsFormBorder.cf_mediqNewModel textarea,
.confiFormsFormBorder.cf_mediqNewModel select {
width: 100% !important;
min-height: 42px !important;
padding: 8px 13px !important;
background: #ffffff !important;
border: 1px solid #d7e5eb !important;
border-radius: 12px !important;
box-shadow: 0 2px 8px rgba(7,53,83,.035) !important;
color: #173b59 !important;
font-family: inherit !important;
font-size: 13px !important;
direction: rtl !important;
text-align: right !important;
transition: border-color .16s ease, box-shadow .16s ease, background .16s ease !important;
}
#mqCfBody input:focus,
#mqCfBody textarea:focus,
#mqCfBody select:focus,
#mqModelBody input:focus,
#mqModelBody textarea:focus,
#mqModelBody select:focus,
.confiFormsFormBorder.cf_mediqNewAsset input:focus,
.confiFormsFormBorder.cf_mediqNewAsset textarea:focus,
.confiFormsFormBorder.cf_mediqNewAsset select:focus,
.confiFormsFormBorder.cf_mediqNewModel input:focus,
.confiFormsFormBorder.cf_mediqNewModel textarea:focus,
.confiFormsFormBorder.cf_mediqNewModel select:focus {
outline: none !important;
border-color: #22bdb4 !important;
box-shadow: 0 0 0 3px rgba(8,185,176,.10) !important;
background: #fff !important;
}
/* ---------- Select2 / Assets reference controls: no gray block ---------- */
#mqCfBody .select2-container,
#mqModelBody .select2-container,
.confiFormsFormBorder.cf_mediqNewAsset .select2-container,
.confiFormsFormBorder.cf_mediqNewModel .select2-container {
direction: rtl !important;
background: transparent !important;
}
#mqCfBody .select2-choice,
#mqCfBody .select2-selection,
#mqCfBody .aui-select2-choice,
#mqModelBody .select2-choice,
#mqModelBody .select2-selection,
#mqModelBody .aui-select2-choice,
.confiFormsFormBorder.cf_mediqNewAsset .select2-choice,
.confiFormsFormBorder.cf_mediqNewAsset .select2-selection,
.confiFormsFormBorder.cf_mediqNewAsset .aui-select2-choice,
.confiFormsFormBorder.cf_mediqNewModel .select2-choice,
.confiFormsFormBorder.cf_mediqNewModel .select2-selection,
.confiFormsFormBorder.cf_mediqNewModel .aui-select2-choice {
min-height: 42px !important;
height: 42px !important;
background: #fff !important;
border: 1px solid #d7e5eb !important;
border-radius: 12px !important;
box-shadow: 0 2px 8px rgba(7,53,83,.035) !important;
color: #173b59 !important;
}
#mqCfBody .select2-chosen,
#mqCfBody .select2-selection__rendered,
#mqModelBody .select2-chosen,
#mqModelBody .select2-selection__rendered,
.confiFormsFormBorder.cf_mediqNewAsset .select2-chosen,
.confiFormsFormBorder.cf_mediqNewAsset .select2-selection__rendered,
.confiFormsFormBorder.cf_mediqNewModel .select2-chosen,
.confiFormsFormBorder.cf_mediqNewModel .select2-selection__rendered {
direction: rtl !important;
text-align: right !important;
line-height: 40px !important;
color: #173b59 !important;
}
/* model quick-create form: tighter rows and softer cards */
#mqModelBody .confiFormsFormContent,
.confiFormsFormBorder.cf_mediqNewModel .confiFormsFormContent {
padding: 10px 6px !important;
}
#mqModelBody td,
.confiFormsFormBorder.cf_mediqNewModel td {
padding-top: 5px !important;
padding-bottom: 5px !important;
}
#mqModelBody tr:not(.mq-form-section-row) > td:last-child,
.confiFormsFormBorder.cf_mediqNewModel tr:not(.mq-form-section-row) > td:last-child {
background: #fff !important;
border-radius: 13px !important;
}
#mqModelBody .mq-form-section-row td,
.confiFormsFormBorder.cf_mediqNewModel .mq-form-section-row td {
padding-top: 9px !important;
padding-bottom: 4px !important;
}
/* ---------- GREEN submit buttons, never Atlassian blue ---------- */
#mqCfBody .save-cf-btn,
#mqCfBody .aui-button-primary,
#mqModelBody .save-cf-btn,
#mqModelBody .aui-button-primary,
.confiFormsFormBorder.cf_mediqNewAsset .save-cf-btn,
.confiFormsFormBorder.cf_mediqNewAsset .aui-button-primary,
.confiFormsFormBorder.cf_mediqNewModel .save-cf-btn,
.confiFormsFormBorder.cf_mediqNewModel .aui-button-primary,
body.mq-asset-form-open .aui-dialog .save-cf-btn,
body.mq-asset-form-open .aui-dialog .aui-button-primary,
body.mq-model-form-open .aui-dialog .save-cf-btn,
body.mq-model-form-open .aui-dialog .aui-button-primary {
min-width: 132px !important;
min-height: 42px !important;
padding: 0 18px !important;
border: 1px solid #08aaa4 !important;
border-radius: 11px !important;
background: linear-gradient(135deg,#08b9b0 0%,#069e98 100%) !important;
background-color: #08b9b0 !important;
color: #fff !important;
text-shadow: none !important;
box-shadow: 0 8px 18px rgba(8,185,176,.18) !important;
font-family: inherit !important;
font-weight: 900 !important;
}
#mqCfBody .save-cf-btn:hover,
#mqCfBody .aui-button-primary:hover,
#mqModelBody .save-cf-btn:hover,
#mqModelBody .aui-button-primary:hover,
.confiFormsFormBorder.cf_mediqNewAsset .save-cf-btn:hover,
.confiFormsFormBorder.cf_mediqNewAsset .aui-button-primary:hover,
.confiFormsFormBorder.cf_mediqNewModel .save-cf-btn:hover,
.confiFormsFormBorder.cf_mediqNewModel .aui-button-primary:hover {
background: #068f89 !important;
background-color: #068f89 !important;
border-color: #068f89 !important;
}
/* add buttons keep same MediQ green family */
.mq-model-plus,
#mqCfBody button[type="button"].mq-model-plus,
#mqModelBody button[type="button"].mq-model-plus {
background:#e9fbf9 !important;
border:1px solid #8fded8 !important;
color:#078f89 !important;
border-radius:11px !important;
}
/* footer alignment RTL */
#mqCfBody .confiFormsFormFooter,
#mqModelBody .confiFormsFormFooter,
.confiFormsFormBorder.cf_mediqNewAsset .confiFormsFormFooter,
.confiFormsFormBorder.cf_mediqNewModel .confiFormsFormFooter {
direction: rtl !important;
text-align: right !important;
}
</style>
<style id="mq-v43-datepicker-layer-fix">
/* ============================================================
V43 - DATE PICKER LAYER FIX ONLY
Keeps V42 form design unchanged and prevents calendar leakage.
============================================================ */
body.mq-asset-form-open #ui-datepicker-div,
body.mq-asset-form-open .ui-datepicker,
body.mq-asset-form-open .aui-datepicker,
body.mq-asset-form-open .aui-datepicker-dialog,
body.mq-asset-form-open .aui-inline-dialog,
body.mq-asset-form-open [class*="datepicker-popup"] {
z-index: 2147483000 !important;
}
/* AUI DatePicker is often rendered as an inline-dialog outside ConfiForms. */
body > .aui-inline-dialog,
body > .aui-datepicker-dialog,
body > #ui-datepicker-div {
z-index: 2147483000 !important;
}
/* Never let a calendar become visible inside the MediQ asset-list host. */
#mediq-dashboard .mq-assets-host .ui-datepicker,
#mediq-dashboard .mq-assets-host .aui-datepicker,
#mediq-dashboard .mq-assets-host .aui-datepicker-dialog,
#mediq-dashboard .mq-assets-host .aui-inline-dialog,
#mediq-dashboard .mq-assets-host [class*="datepicker"],
#mediq-dashboard .mq-assets-host [class*="calendar"] {
display: none !important;
}
</style>
<script id="mq-v43-datepicker-cleanup">
(function () {
function mqHideLooseDatePickers() {
var selectors = [
'#ui-datepicker-div',
'.aui-datepicker-dialog',
'.aui-inline-dialog'
];
for (var s = 0; s < selectors.length; s++) {
var nodes = document.querySelectorAll(selectors[s]);
for (var i = 0; i < nodes.length; i++) {
var n = nodes[i];
/* Do not touch ordinary Select2 dropdowns. */
var marker = ((n.id || '') + ' ' + (n.className || '') + ' ' + (n.textContent || '')).toLowerCase();
var looksLikeDatePicker =
marker.indexOf('datepicker') >= 0 ||
marker.indexOf('date-picker') >= 0 ||
marker.indexOf('calendar') >= 0 ||
!!n.querySelector('.ui-datepicker, .aui-datepicker');
if (!looksLikeDatePicker && selectors[s] === '.aui-inline-dialog') continue;
try { n.style.zIndex = '2147483000'; } catch (ignore) {}
}
}
}
/* Raise the AUI calendar whenever the purchase-date field/icon is used. */
document.addEventListener('mousedown', function (e) {
if (!document.body.classList.contains('mq-asset-form-open')) return;
var t = e.target;
if (!t) return;
var field = t.closest ? t.closest('[name="purchaseDate"], .aui-date-picker, [class*="date-picker"], [class*="datepicker"]') : null;
if (!field) return;
window.setTimeout(mqHideLooseDatePickers, 0);
window.setTimeout(mqHideLooseDatePickers, 40);
window.setTimeout(mqHideLooseDatePickers, 120);
}, true);
document.addEventListener('focusin', function (e) {
var t = e.target;
if (!t || !document.body.classList.contains('mq-asset-form-open')) return;
if ((t.name || '') === 'purchaseDate') {
window.setTimeout(mqHideLooseDatePickers, 0);
window.setTimeout(mqHideLooseDatePickers, 80);
}
}, true);
})();
</script>
<!-- ============================================================
MEDIQ V44 - PERSIAN (JALALI) PURCHASE DATE PICKER
Visual Persian date, Gregorian MMM dd, yyyy stored for ConfiForms
============================================================ -->
<style id="mq-v44-jalali-datepicker-style">
/* Hide the original ConfiForms purchaseDate control only after our Jalali proxy is ready. */
#mqCfBody .mq-jalali-real-date,
.confiFormsFormBorder.cf_mediqNewAsset .mq-jalali-real-date {
position: absolute !important;
width: 1px !important;
height: 1px !important;
min-width: 1px !important;
min-height: 1px !important;
opacity: 0 !important;
pointer-events: none !important;
padding: 0 !important;
margin: 0 !important;
border: 0 !important;
overflow: hidden !important;
}
.mq-jalali-shell {
position: relative !important;
display: flex !important;
align-items: center !important;
gap: 8px !important;
width: 100% !important;
direction: rtl !important;
}
.mq-jalali-input {
width: 100% !important;
min-height: 42px !important;
padding: 8px 44px 8px 13px !important;
background: #fff !important;
border: 1px solid #d7e5eb !important;
border-radius: 12px !important;
box-shadow: 0 2px 8px rgba(7,53,83,.035) !important;
color: #173b59 !important;
font-family: inherit !important;
font-size: 13px !important;
direction: rtl !important;
text-align: right !important;
cursor: pointer !important;
outline: none !important;
}
.mq-jalali-input:focus {
border-color: #22bdb4 !important;
box-shadow: 0 0 0 3px rgba(8,185,176,.10) !important;
}
.mq-jalali-calendar-btn {
position: absolute !important;
left: 10px !important;
top: 50% !important;
transform: translateY(-50%) !important;
width: 30px !important;
height: 30px !important;
border: 0 !important;
border-radius: 9px !important;
background: #e9fbf9 !important;
color: #078f89 !important;
display: inline-flex !important;
align-items: center !important;
justify-content: center !important;
cursor: pointer !important;
font-size: 16px !important;
line-height: 1 !important;
padding: 0 !important;
box-shadow: none !important;
}
.mq-jalali-calendar-btn:hover {
background: #d8f7f4 !important;
}
#mqJalaliPicker {
position: fixed !important;
z-index: 2147483646 !important;
width: 326px !important;
background: #fff !important;
border: 1px solid #d7e5eb !important;
border-radius: 16px !important;
box-shadow: 0 22px 60px rgba(3,35,55,.25) !important;
padding: 12px !important;
direction: rtl !important;
font-family: inherit !important;
color: #173b59 !important;
}
#mqJalaliPicker[hidden] { display: none !important; }
#mqJalaliPicker .mq-jp-head {
display: grid !important;
grid-template-columns: 38px 1fr 38px !important;
align-items: center !important;
gap: 8px !important;
margin-bottom: 10px !important;
}
#mqJalaliPicker .mq-jp-title {
text-align: center !important;
font-size: 14px !important;
font-weight: 900 !important;
color: #073553 !important;
}
#mqJalaliPicker .mq-jp-nav {
width: 38px !important;
height: 34px !important;
border: 1px solid #d7e5eb !important;
border-radius: 10px !important;
background: #f7fbfc !important;
color: #087f7a !important;
cursor: pointer !important;
font-size: 18px !important;
font-weight: 900 !important;
padding: 0 !important;
}
#mqJalaliPicker .mq-jp-week,
#mqJalaliPicker .mq-jp-days {
display: grid !important;
grid-template-columns: repeat(7, 1fr) !important;
gap: 4px !important;
}
#mqJalaliPicker .mq-jp-week {
margin-bottom: 4px !important;
}
#mqJalaliPicker .mq-jp-week span {
min-height: 28px !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
color: #6b8596 !important;
font-size: 11px !important;
font-weight: 800 !important;
}
#mqJalaliPicker .mq-jp-day,
#mqJalaliPicker .mq-jp-empty {
height: 34px !important;
border-radius: 9px !important;
}
#mqJalaliPicker .mq-jp-day {
border: 0 !important;
background: transparent !important;
color: #173b59 !important;
cursor: pointer !important;
font-family: inherit !important;
font-size: 12px !important;
font-weight: 800 !important;
padding: 0 !important;
}
#mqJalaliPicker .mq-jp-day:hover {
background: #eafaf8 !important;
color: #078f89 !important;
}
#mqJalaliPicker .mq-jp-day.today {
box-shadow: inset 0 0 0 1px #22bdb4 !important;
}
#mqJalaliPicker .mq-jp-day.selected {
background: linear-gradient(135deg,#08b9b0 0%,#069e98 100%) !important;
color: #fff !important;
box-shadow: 0 5px 12px rgba(8,185,176,.18) !important;
}
#mqJalaliPicker .mq-jp-foot {
display: flex !important;
justify-content: space-between !important;
gap: 8px !important;
margin-top: 9px !important;
padding-top: 9px !important;
border-top: 1px solid #edf3f5 !important;
}
#mqJalaliPicker .mq-jp-foot button {
border: 0 !important;
border-radius: 9px !important;
min-height: 32px !important;
padding: 0 11px !important;
background: #f2f7f9 !important;
color: #47677d !important;
cursor: pointer !important;
font-family: inherit !important;
font-size: 11px !important;
font-weight: 800 !important;
}
#mqJalaliPicker .mq-jp-foot button.primary {
background: #e9fbf9 !important;
color: #078f89 !important;
}
/* Disable/hide the native AUI calendar trigger beside purchaseDate after Jalali UI is mounted. */
.mq-jalali-host .aui-iconfont-calendar,
.mq-jalali-host [class*="calendar-icon"],
.mq-jalali-host [aria-label*="calendar" i],
.mq-jalali-host [title*="calendar" i],
.mq-jalali-host [aria-label*="date" i][role="button"],
.mq-jalali-host [title*="date" i][role="button"] {
display: none !important;
}
/* The asset list must never display any calendar implementation. */
#mediq-dashboard .mq-assets-host #mqJalaliPicker,
#mediq-dashboard .mq-assets-host .mq-jalali-shell,
#mediq-dashboard .mq-assets-host .ui-datepicker,
#mediq-dashboard .mq-assets-host .aui-datepicker,
#mediq-dashboard .mq-assets-host .aui-datepicker-dialog,
#mediq-dashboard .mq-assets-host [class*="calendar"] {
display: none !important;
}
</style>
<script id="mq-v44-jalali-datepicker-script">
(function () {
'use strict';
var MONTHS_FA = [
'فروردین','اردیبهشت','خرداد','تیر','مرداد','شهریور',
'مهر','آبان','آذر','دی','بهمن','اسفند'
];
var WEEK_FA = ['ش','ی','د','س','چ','پ','ج'];
var G_MONTHS = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
function div(a, b) { return Math.trunc(a / b); }
function mod(a, b) { return a - Math.trunc(a / b) * b; }
function jalCal(jy, withoutLeap) {
var breaks = [-61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210,
1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178];
var bl = breaks.length;
var gy = jy + 621;
var leapJ = -14;
var jp = breaks[0];
var jm, jump, leap, leapG, march, n, i;
if (jy < jp || jy >= breaks[bl - 1]) throw new Error('Invalid Jalaali year ' + jy);
for (i = 1; i < bl; i += 1) {
jm = breaks[i];
jump = jm - jp;
if (jy < jm) break;
leapJ = leapJ + div(jump, 33) * 8 + div(mod(jump, 33), 4);
jp = jm;
}
n = jy - jp;
leapJ = leapJ + div(n, 33) * 8 + div(mod(n, 33) + 3, 4);
if (mod(jump, 33) === 4 && jump - n === 4) leapJ += 1;
leapG = div(gy, 4) - div((div(gy, 100) + 1) * 3, 4) - 150;
march = 20 + leapJ - leapG;
if (withoutLeap) return { gy: gy, march: march };
if (jump - n < 6) n = n - jump + div(jump + 4, 33) * 33;
leap = mod(mod(n + 1, 33) - 1, 4);
if (leap === -1) leap = 4;
return { leap: leap, gy: gy, march: march };
}
function g2d(gy, gm, gd) {
var d = div((gy + div(gm - 8, 6) + 100100) * 1461, 4)
+ div(153 * mod(gm + 9, 12) + 2, 5)
+ gd - 34840408;
d = d - div(div(gy + 100100 + div(gm - 8, 6), 100) * 3, 4) + 752;
return d;
}
function d2g(jdn) {
var j = 4 * jdn + 139361631;
j = j + div(div(4 * jdn + 183187720, 146097) * 3, 4) * 4 - 3908;
var i = div(mod(j, 1461), 4) * 5 + 308;
var gd = div(mod(i, 153), 5) + 1;
var gm = mod(div(i, 153), 12) + 1;
var gy = div(j, 1461) - 100100 + div(8 - gm, 6);
return { gy: gy, gm: gm, gd: gd };
}
function j2d(jy, jm, jd) {
var r = jalCal(jy, true);
return g2d(r.gy, 3, r.march) + (jm - 1) * 31 - div(jm, 7) * (jm - 7) + jd - 1;
}
function d2j(jdn) {
var g = d2g(jdn);
var jy = g.gy - 621;
var r = jalCal(jy, false);
var jdn1f = g2d(g.gy, 3, r.march);
var k = jdn - jdn1f;
if (k >= 0) {
if (k <= 185) return { jy: jy, jm: 1 + div(k, 31), jd: mod(k, 31) + 1 };
k -= 186;
} else {
jy -= 1;
k += 179;
if (r.leap === 1) k += 1;
}
return { jy: jy, jm: 7 + div(k, 30), jd: mod(k, 30) + 1 };
}
function toGregorian(jy, jm, jd) { return d2g(j2d(jy, jm, jd)); }
function toJalaali(gy, gm, gd) { return d2j(g2d(gy, gm, gd)); }
function isLeapJalaaliYear(jy) { return jalCal(jy, false).leap === 0; }
function jalaaliMonthLength(jy, jm) {
if (jm <= 6) return 31;
if (jm <= 11) return 30;
return isLeapJalaaliYear(jy) ? 30 : 29;
}
function faDigits(value) {
return String(value).replace(/\d/g, function (d) { return '۰۱۲۳۴۵۶۷۸۹'[Number(d)]; });
}
function enDigits(value) {
return String(value || '')
.replace(/[۰-۹]/g, function (d) { return '۰۱۲۳۴۵۶۷۸۹'.indexOf(d); })
.replace(/[٠-٩]/g, function (d) { return '٠١٢٣٤٥٦٧٨٩'.indexOf(d); });
}
function pad2(n) { return n < 10 ? '0' + n : String(n); }
function formatJalali(j) {
return faDigits(j.jy + '/' + pad2(j.jm) + '/' + pad2(j.jd));
}
function formatGregorianForConfiForms(g) {
return G_MONTHS[g.gm - 1] + ' ' + pad2(g.gd) + ', ' + g.gy;
}
function parseGregorian(value) {
value = enDigits(value).trim();
if (!value) return null;
var m = value.match(/^([A-Za-z]{3})\s+(\d{1,2}),\s*(\d{4})$/);
if (m) {
var gm = G_MONTHS.map(function (x) { return x.toLowerCase(); }).indexOf(m[1].toLowerCase()) + 1;
if (gm > 0) return { gy: Number(m[3]), gm: gm, gd: Number(m[2]) };
}
m = value.match(/^(\d{4})[-\/]([01]?\d)[-\/]([0-3]?\d)$/);
if (m && Number(m[1]) > 1700) {
return { gy: Number(m[1]), gm: Number(m[2]), gd: Number(m[3]) };
}
var d = new Date(value);
if (!isNaN(d.getTime())) {
return { gy: d.getFullYear(), gm: d.getMonth() + 1, gd: d.getDate() };
}
return null;
}
function parseJalali(value) {
value = enDigits(value).trim();
var m = value.match(/^(1[2-5]\d{2})[-\/]([01]?\d)[-\/]([0-3]?\d)$/);
if (!m) return null;
var j = { jy: Number(m[1]), jm: Number(m[2]), jd: Number(m[3]) };
if (j.jm < 1 || j.jm > 12 || j.jd < 1 || j.jd > jalaaliMonthLength(j.jy, j.jm)) return null;
return j;
}
var picker = null;
var active = null;
var viewJ = null;
function ensurePicker() {
if (picker) return picker;
picker = document.createElement('div');
picker.id = 'mqJalaliPicker';
picker.hidden = true;
picker.innerHTML =
'<div class="mq-jp-head">' +
'<button type="button" class="mq-jp-nav mq-jp-next" aria-label="ماه بعد">‹</button>' +
'<div class="mq-jp-title"></div>' +
'<button type="button" class="mq-jp-nav mq-jp-prev" aria-label="ماه قبل">›</button>' +
'</div>' +
'<div class="mq-jp-week">' + WEEK_FA.map(function (d) { return '<span>' + d + '</span>'; }).join('') + '</div>' +
'<div class="mq-jp-days"></div>' +
'<div class="mq-jp-foot">' +
'<button type="button" class="mq-jp-clear">پاک کردن</button>' +
'<button type="button" class="mq-jp-today primary">امروز</button>' +
'</div>';
document.body.appendChild(picker);
picker.querySelector('.mq-jp-prev').onclick = function () { changeMonth(-1); };
picker.querySelector('.mq-jp-next').onclick = function () { changeMonth(1); };
picker.querySelector('.mq-jp-today').onclick = function () {
var now = new Date();
selectJalali(toJalaali(now.getFullYear(), now.getMonth() + 1, now.getDate()));
};
picker.querySelector('.mq-jp-clear').onclick = function () {
if (!active) return;
setRealDate(active.real, '');
active.proxy.value = '';
closePicker();
};
return picker;
}
function changeMonth(delta) {
if (!viewJ) return;
var jy = viewJ.jy;
var jm = viewJ.jm + delta;
if (jm < 1) { jm = 12; jy -= 1; }
if (jm > 12) { jm = 1; jy += 1; }
viewJ = { jy: jy, jm: jm, jd: 1 };
renderPicker();
}
function selectedJalali() {
if (!active || !active.real.value) return null;
var g = parseGregorian(active.real.value);
if (g) return toJalaali(g.gy, g.gm, g.gd);
var j = parseJalali(active.real.value);
return j || null;
}
function renderPicker() {
ensurePicker();
var title = picker.querySelector('.mq-jp-title');
var daysHost = picker.querySelector('.mq-jp-days');
title.textContent = MONTHS_FA[viewJ.jm - 1] + ' ' + faDigits(viewJ.jy);
var firstG = toGregorian(viewJ.jy, viewJ.jm, 1);
var firstDate = new Date(firstG.gy, firstG.gm - 1, firstG.gd);
var offset = (firstDate.getDay() + 1) % 7; // Saturday = 0
var len = jalaaliMonthLength(viewJ.jy, viewJ.jm);
var now = new Date();
var todayJ = toJalaali(now.getFullYear(), now.getMonth() + 1, now.getDate());
var selected = selectedJalali();
var html = '';
for (var i = 0; i < offset; i++) html += '<span class="mq-jp-empty"></span>';
for (var d = 1; d <= len; d++) {
var cls = 'mq-jp-day';
if (todayJ.jy === viewJ.jy && todayJ.jm === viewJ.jm && todayJ.jd === d) cls += ' today';
if (selected && selected.jy === viewJ.jy && selected.jm === viewJ.jm && selected.jd === d) cls += ' selected';
html += '<button type="button" class="' + cls + '" data-day="' + d + '">' + faDigits(d) + '</button>';
}
daysHost.innerHTML = html;
var buttons = daysHost.querySelectorAll('.mq-jp-day');
for (var b = 0; b < buttons.length; b++) {
buttons[b].onclick = function () {
selectJalali({ jy: viewJ.jy, jm: viewJ.jm, jd: Number(this.getAttribute('data-day')) });
};
}
}
function setRealDate(real, value) {
real.value = value;
real.setAttribute('value', value);
try { real.dispatchEvent(new Event('input', { bubbles: true })); } catch (e) {}
try { real.dispatchEvent(new Event('change', { bubbles: true })); } catch (e) {}
try { real.dispatchEvent(new Event('blur', { bubbles: true })); } catch (e) {}
try {
if (window.AJS && AJS.$) {
AJS.$(real).val(value).trigger('input').trigger('change');
}
} catch (e) {}
}
function selectJalali(j) {
if (!active) return;
var g = toGregorian(j.jy, j.jm, j.jd);
setRealDate(active.real, formatGregorianForConfiForms(g));
active.proxy.value = formatJalali(j);
closePicker();
}
function positionPicker() {
if (!active || !picker || picker.hidden) return;
var r = active.proxy.getBoundingClientRect();
var width = 326;
var left = Math.max(10, Math.min(window.innerWidth - width - 10, r.right - width));
var top = r.bottom + 8;
var h = picker.offsetHeight || 355;
if (top + h > window.innerHeight - 10) top = Math.max(10, r.top - h - 8);
picker.style.left = left + 'px';
picker.style.top = top + 'px';
}
function openPicker(item) {
active = item;
ensurePicker();
var selected = selectedJalali();
if (selected) {
viewJ = { jy: selected.jy, jm: selected.jm, jd: 1 };
} else {
var now = new Date();
var j = toJalaali(now.getFullYear(), now.getMonth() + 1, now.getDate());
viewJ = { jy: j.jy, jm: j.jm, jd: 1 };
}
renderPicker();
picker.hidden = false;
positionPicker();
}
function closePicker() {
if (picker) picker.hidden = true;
active = null;
}
function hideNativeDateTrigger(host, real, shell) {
var nodes = host.querySelectorAll('*');
for (var i = 0; i < nodes.length; i++) {
var el = nodes[i];
if (el === real || el === shell || shell.contains(el)) continue;
var marker = ((el.id || '') + ' ' + (el.className || '') + ' ' + (el.getAttribute('title') || '') + ' ' + (el.getAttribute('aria-label') || '')).toLowerCase();
if (marker.indexOf('calendar') >= 0 || marker.indexOf('datepicker') >= 0 || marker.indexOf('date-picker') >= 0) {
el.style.display = 'none';
}
}
}
function syncExistingValue(real, proxy) {
var j = parseJalali(real.value);
if (j) {
var g = toGregorian(j.jy, j.jm, j.jd);
setRealDate(real, formatGregorianForConfiForms(g));
proxy.value = formatJalali(j);
return;
}
var g2 = parseGregorian(real.value);
if (g2) {
proxy.value = formatJalali(toJalaali(g2.gy, g2.gm, g2.gd));
}
}
function initRealInput(real) {
if (!real || real.getAttribute('data-mq-jalali-ready') === '1') return;
real.setAttribute('data-mq-jalali-ready', '1');
var host = real.parentElement;
if (!host) return;
host.classList.add('mq-jalali-host');
var shell = document.createElement('div');
shell.className = 'mq-jalali-shell';
var proxy = document.createElement('input');
proxy.type = 'text';
proxy.className = 'mq-jalali-input';
proxy.placeholder = 'تاریخ شمسی را انتخاب کنید';
proxy.readOnly = true;
proxy.autocomplete = 'off';
proxy.setAttribute('aria-label', 'تاریخ خرید شمسی');
var button = document.createElement('button');
button.type = 'button';
button.className = 'mq-jalali-calendar-btn';
button.setAttribute('aria-label', 'باز کردن تقویم شمسی');
button.innerHTML = '📅';
shell.appendChild(proxy);
shell.appendChild(button);
host.insertBefore(shell, real);
real.classList.add('mq-jalali-real-date');
hideNativeDateTrigger(host, real, shell);
syncExistingValue(real, proxy);
var item = { real: real, proxy: proxy, shell: shell };
proxy.addEventListener('click', function (e) { e.preventDefault(); e.stopPropagation(); openPicker(item); });
button.addEventListener('click', function (e) { e.preventDefault(); e.stopPropagation(); openPicker(item); });
proxy.addEventListener('focus', function () { openPicker(item); });
}
function scan() {
var roots = [document.getElementById('mqCfBody')];
var assetForms = document.querySelectorAll('.confiFormsFormBorder.cf_mediqNewAsset');
for (var x = 0; x < assetForms.length; x++) roots.push(assetForms[x]);
for (var r = 0; r < roots.length; r++) {
if (!roots[r]) continue;
var inputs = roots[r].querySelectorAll('input[name="purchaseDate"], input[id*="purchaseDate"], input[data-field-name="purchaseDate"]');
for (var i = 0; i < inputs.length; i++) initRealInput(inputs[i]);
}
}
document.addEventListener('click', function (e) {
if (picker && !picker.hidden && active) {
if (!picker.contains(e.target) && !active.shell.contains(e.target)) closePicker();
}
var text = ((e.target && (e.target.textContent || e.target.value)) || '').replace(/\s+/g, ' ').trim();
if (text.indexOf('ثبت دارایی جدید') >= 0) {
window.setTimeout(scan, 40);
window.setTimeout(scan, 150);
window.setTimeout(scan, 400);
}
}, true);
window.addEventListener('resize', positionPicker);
window.addEventListener('scroll', function () { if (picker && !picker.hidden) positionPicker(); }, true);
var observer = new MutationObserver(function () { window.setTimeout(scan, 0); });
if (document.body) observer.observe(document.body, { childList: true, subtree: true });
window.mqInitJalaliPurchaseDate = scan;
window.setTimeout(scan, 100);
window.setTimeout(scan, 600);
})();
</script>
<style id="mq-v46-reference-buttons-style">
/* ============================================================
MEDIQ V46 - visible + buttons + child modal polish
============================================================ */
body.mq-model-form-open .cf_mediqNewModel .mq-reference-cell-v46{
background:#fff !important;
}
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46{
width:100% !important;
display:flex !important;
flex-direction:row !important;
align-items:center !important;
gap:8px !important;
direction:ltr !important;
}
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > .select2-container,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > select,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > input{
flex:1 1 auto !important;
min-width:0 !important;
width:auto !important;
max-width:none !important;
direction:rtl !important;
}
.mq-reference-plus-v46{
flex:0 0 38px !important;
width:38px !important;
min-width:38px !important;
height:38px !important;
padding:0 !important;
margin:0 !important;
border:1px solid #8fded8 !important;
border-radius:11px !important;
background:#e9fbf9 !important;
color:#078f89 !important;
font:900 22px/36px Tahoma,Arial,sans-serif !important;
text-align:center !important;
cursor:pointer !important;
box-shadow:none !important;
transition:.16s ease !important;
}
.mq-reference-plus-v46:hover{
background:#08b9b0 !important;
border-color:#08b9b0 !important;
color:#fff !important;
}
.mq-reference-plus-v46:focus{
outline:none !important;
box-shadow:0 0 0 4px rgba(8,185,176,.14) !important;
}
#mqReferenceModalV46{
position:fixed !important;
inset:0 !important;
z-index:2147483300 !important;
display:none !important;
align-items:center !important;
justify-content:center !important;
padding:24px !important;
background:rgba(3,35,55,.56) !important;
backdrop-filter:blur(3px) !important;
direction:rtl !important;
}
#mqReferenceModalV46.open{
display:flex !important;
}
body:not(.mq-reference-form-open-v46) .cf_mediqNewEquipmentTitle,
body:not(.mq-reference-form-open-v46) .cf_mediqNewManufacturer,
body:not(.mq-reference-form-open-v46) .cf_mediqNewFacility,
body:not(.mq-reference-form-open-v46) .cf_mediqNewClassification{
position:fixed !important;
left:-200vw !important;
top:0 !important;
width:1px !important;
height:1px !important;
max-width:1px !important;
max-height:1px !important;
overflow:hidden !important;
opacity:0 !important;
visibility:hidden !important;
pointer-events:none !important;
margin:0 !important;
padding:0 !important;
}
body.mq-reference-form-open-v46 .mq-reference-panel-v46{
display:block !important;
position:fixed !important;
z-index:2147483400 !important;
left:50% !important;
top:50% !important;
transform:translate(-50%,-50%) !important;
width:min(760px,94vw) !important;
max-width:94vw !important;
height:auto !important;
max-height:86vh !important;
overflow-y:auto !important;
overflow-x:hidden !important;
margin:0 !important;
padding:0 !important;
opacity:1 !important;
visibility:visible !important;
pointer-events:auto !important;
background:#fff !important;
border:1px solid #dce9ef !important;
border-radius:20px !important;
box-shadow:0 30px 90px rgba(3,35,55,.31) !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-reference-form-open-v46 .mq-reference-panel-v46 .confiFormsFormTitle{
display:flex !important;
align-items:center !important;
justify-content:space-between !important;
gap:12px !important;
position:sticky !important;
top:0 !important;
z-index:20 !important;
margin:0 !important;
padding:17px 20px !important;
background:#fff !important;
border-bottom:1px solid #e4eef2 !important;
}
body.mq-reference-form-open-v46 .mq-reference-panel-v46 .confiFormsFormContent{
padding:14px 18px 18px !important;
overflow:visible !important;
background:#fff !important;
}
body.mq-reference-form-open-v46 .mq-reference-panel-v46 .confiFormsFormFooter{
padding:12px 18px 18px !important;
background:#fff !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-reference-form-open-v46 .mq-reference-panel-v46 form,
body.mq-reference-form-open-v46 .mq-reference-panel-v46 table{
width:100% !important;
max-width:100% !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-reference-form-open-v46 .mq-reference-panel-v46 td{
padding:6px 8px !important;
border:0 !important;
direction:rtl !important;
text-align:right !important;
vertical-align:middle !important;
background:#fff !important;
}
body.mq-reference-form-open-v46 .mq-reference-panel-v46 label{
color:#173b59 !important;
font-weight:800 !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-reference-form-open-v46 .mq-reference-panel-v46 input[type="text"],
body.mq-reference-form-open-v46 .mq-reference-panel-v46 input[type="number"],
body.mq-reference-form-open-v46 .mq-reference-panel-v46 input[type="date"],
body.mq-reference-form-open-v46 .mq-reference-panel-v46 textarea,
body.mq-reference-form-open-v46 .mq-reference-panel-v46 select,
body.mq-reference-form-open-v46 .mq-reference-panel-v46 .select2-choice,
body.mq-reference-form-open-v46 .mq-reference-panel-v46 .select2-selection,
body.mq-reference-form-open-v46 .mq-reference-panel-v46 .aui-select2-choice{
width:100% !important;
min-height:42px !important;
padding:8px 13px !important;
background:#fff !important;
border:1px solid #d7e5eb !important;
border-radius:12px !important;
box-shadow:0 2px 8px rgba(7,53,83,.035) !important;
color:#173b59 !important;
font-family:inherit !important;
font-size:13px !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-reference-form-open-v46 .mq-reference-panel-v46 .save-cf-btn,
body.mq-reference-form-open-v46 .mq-reference-panel-v46 .aui-button-primary{
min-width:132px !important;
min-height:42px !important;
padding:0 18px !important;
border:1px solid #08aaa4 !important;
border-radius:11px !important;
background:linear-gradient(135deg,#08b9b0 0%,#069e98 100%) !important;
background-color:#08b9b0 !important;
color:#fff !important;
text-shadow:none !important;
box-shadow:0 8px 18px rgba(8,185,176,.18) !important;
font-family:inherit !important;
font-weight:900 !important;
}
body.mq-reference-form-open-v46 .select2-drop,
body.mq-reference-form-open-v46 .select2-dropdown,
body.mq-reference-form-open-v46 .aui-select2-drop{
z-index:2147483500 !important;
}
</style>
<style id="mq-v48-clean-form-style">
/* ============================================================
MEDIQ V48 - full width dropdowns + nested Classification modal
============================================================ */
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46{
width:100% !important;
max-width:100% !important;
display:grid !important;
grid-template-columns:minmax(0,1fr) 42px !important;
align-items:center !important;
gap:8px !important;
direction:ltr !important;
}
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > .select2-container,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > select,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > input{
grid-column:1 !important;
width:100% !important;
max-width:100% !important;
min-width:0 !important;
flex:none !important;
display:block !important;
direction:rtl !important;
}
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 > .mq-reference-plus-v46{
grid-column:2 !important;
width:42px !important;
min-width:42px !important;
max-width:42px !important;
height:42px !important;
min-height:42px !important;
}
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 .select2-choice,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 .select2-selection,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 .aui-select2-choice{
width:100% !important;
max-width:100% !important;
min-width:0 !important;
min-height:42px !important;
height:42px !important;
border:1px solid #d7e5eb !important;
border-radius:12px !important;
background:#fff !important;
box-shadow:none !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 .select2-chosen,
body.mq-model-form-open .cf_mediqNewModel .mq-reference-control-wrap-v46 .select2-selection__rendered{
width:100% !important;
line-height:40px !important;
padding:0 12px !important;
direction:rtl !important;
text-align:right !important;
}
/* Equipment Title -> Group [+] */
body.mq-reference-form-open-v46 .mq-reference-panel-v46[data-mq-reference-form="mediqNewEquipmentTitle"] .mq-nested-ref-wrap-v48{
width:100% !important;
max-width:100% !important;
display:grid !important;
grid-template-columns:minmax(0,1fr) 42px !important;
align-items:center !important;
gap:8px !important;
direction:ltr !important;
}
body.mq-reference-form-open-v46 .mq-reference-panel-v46[data-mq-reference-form="mediqNewEquipmentTitle"] .mq-nested-ref-wrap-v48 > .select2-container,
body.mq-reference-form-open-v46 .mq-reference-panel-v46[data-mq-reference-form="mediqNewEquipmentTitle"] .mq-nested-ref-wrap-v48 > select,
body.mq-reference-form-open-v46 .mq-reference-panel-v46[data-mq-reference-form="mediqNewEquipmentTitle"] .mq-nested-ref-wrap-v48 > input{
grid-column:1 !important;
width:100% !important;
max-width:100% !important;
min-width:0 !important;
}
body.mq-reference-form-open-v46 .mq-reference-panel-v46[data-mq-reference-form="mediqNewEquipmentTitle"] .mq-nested-ref-wrap-v48 > .mq-equipment-title-group-plus-v48{
grid-column:2 !important;
width:42px !important;
min-width:42px !important;
height:42px !important;
}
/* Nested Classification modal */
#mqNestedReferenceModalV48{
position:fixed !important;
inset:0 !important;
z-index:2147483600 !important;
display:none !important;
align-items:center !important;
justify-content:center !important;
padding:24px !important;
background:rgba(3,35,55,.44) !important;
backdrop-filter:blur(2px) !important;
direction:rtl !important;
}
#mqNestedReferenceModalV48.open{
display:flex !important;
}
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48{
position:fixed !important;
z-index:2147483700 !important;
top:50% !important;
left:50% !important;
transform:translate(-50%,-50%) !important;
display:block !important;
width:min(700px,92vw) !important;
max-width:92vw !important;
max-height:82vh !important;
overflow:auto !important;
opacity:1 !important;
visibility:visible !important;
pointer-events:auto !important;
border:1px solid #dce9ef !important;
border-radius:20px !important;
background:#fff !important;
box-shadow:0 30px 90px rgba(3,35,55,.30) !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 form,
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 table{
width:100% !important;
max-width:100% !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 td{
padding:7px 10px !important;
border:0 !important;
background:#fff !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 input[type="text"],
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 textarea,
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 select,
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 .select2-container,
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 .select2-choice,
body.mq-nested-reference-open-v48 .mq-nested-reference-panel-v48 .select2-selection{
width:100% !important;
max-width:100% !important;
min-height:42px !important;
border-radius:12px !important;
background:#fff !important;
}
body.mq-nested-reference-open-v48 .select2-drop,
body.mq-nested-reference-open-v48 .select2-dropdown,
body.mq-nested-reference-open-v48 .aui-select2-drop{
z-index:2147483800 !important;
}
</style>
<style id="mq-v50-top-down-registration">
/* ============================================================
MEDIQ V50 - TOP-DOWN REGISTRATION UI
============================================================ */
#mqRegistrationFlowBackdropV50{
position:fixed !important;
inset:0 !important;
z-index:2147483000 !important;
display:none !important;
background:rgba(3,35,55,.56) !important;
backdrop-filter:blur(4px) !important;
}
#mqRegistrationFlowBackdropV50.open{
display:block !important;
}
body.mq-flow-open-v50 #mqCfModal,
body.mq-flow-open-v50 #mqModelModal,
body.mq-flow-open-v50 #mqReferenceModalV46,
body.mq-flow-open-v50 #mqNestedReferenceModalV48{
display:none !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50{
display:block !important;
position:fixed !important;
z-index:2147483100 !important;
left:50% !important;
top:50% !important;
transform:translate(-50%,-50%) !important;
width:min(860px,94vw) !important;
max-width:94vw !important;
height:auto !important;
max-height:88vh !important;
overflow-y:auto !important;
overflow-x:hidden !important;
margin:0 !important;
padding:0 !important;
opacity:1 !important;
visibility:visible !important;
pointer-events:auto !important;
background:#fff !important;
border:1px solid #dce9ef !important;
border-radius:22px !important;
box-shadow:0 32px 95px rgba(3,35,55,.32) !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormTitle{
display:none !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormContent{
padding:14px 22px 8px !important;
background:#fff !important;
overflow:visible !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormFooter{
padding:12px 22px 20px !important;
background:#fff !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-flow-open-v50 .mq-flow-selector-v50 .confiFormsFormFooter{
display:none !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 form,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 table{
width:100% !important;
max-width:100% !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 td,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 th{
box-sizing:border-box !important;
border:0 !important;
padding:7px 8px !important;
background:#fff !important;
direction:rtl !important;
text-align:right !important;
vertical-align:middle !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 label{
color:#173b59 !important;
font-family:Tahoma,Arial,sans-serif !important;
font-size:13px !important;
font-weight:900 !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input[type="text"],
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input[type="number"],
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input[type="date"],
body.mq-flow-open-v50 .mq-flow-active-panel-v50 textarea,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 select,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-container,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-choice,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-selection,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .aui-select2-choice{
width:100% !important;
max-width:100% !important;
min-width:0 !important;
min-height:44px !important;
border:1px solid #d6e5eb !important;
border-radius:12px !important;
background:#fff !important;
box-shadow:0 2px 9px rgba(7,53,83,.035) !important;
color:#173b59 !important;
font-family:Tahoma,Arial,sans-serif !important;
font-size:13px !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-chosen,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-selection__rendered{
line-height:42px !important;
padding:0 14px !important;
direction:rtl !important;
text-align:right !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 select.select2-offscreen,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input.select2-offscreen,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 select.select2-hidden-accessible,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input.select2-hidden-accessible{
position:absolute !important;
left:-10000px !important;
width:1px !important;
height:1px !important;
min-width:1px !important;
max-width:1px !important;
opacity:0 !important;
overflow:hidden !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .save-cf-btn,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .aui-button-primary{
min-width:145px !important;
min-height:44px !important;
padding:0 20px !important;
border:1px solid #08aaa4 !important;
border-radius:12px !important;
background:linear-gradient(135deg,#08b9b0 0%,#069e98 100%) !important;
background-color:#08b9b0 !important;
color:#fff !important;
text-shadow:none !important;
box-shadow:0 9px 20px rgba(8,185,176,.18) !important;
font-family:Tahoma,Arial,sans-serif !important;
font-weight:900 !important;
}
body.mq-flow-open-v50 .mq-flow-hidden-row-v50{
display:none !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .mq-reference-plus-v46,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .mq-model-plus,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .mq-equipment-title-group-plus-v48,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .mq-native-form-close{
display:none !important;
}
.mq-flow-head-v50{
position:sticky !important;
top:0 !important;
z-index:40 !important;
padding:18px 22px 14px !important;
background:#fff !important;
border-bottom:1px solid #e4eef2 !important;
}
.mq-flow-head-top-v50{
display:flex !important;
align-items:flex-start !important;
justify-content:space-between !important;
gap:18px !important;
}
.mq-flow-title-v50{
color:#073553 !important;
font-size:18px !important;
font-weight:900 !important;
line-height:1.8 !important;
}
.mq-flow-subtitle-v50{
margin-top:4px !important;
color:#748b9e !important;
font-size:11px !important;
font-weight:700 !important;
line-height:1.9 !important;
}
.mq-flow-close-v50{
flex:0 0 36px !important;
width:36px !important;
height:36px !important;
padding:0 !important;
border:0 !important;
border-radius:10px !important;
background:#f1f6f8 !important;
color:#557287 !important;
font:700 21px/36px Tahoma,Arial,sans-serif !important;
cursor:pointer !important;
}
.mq-flow-close-v50:hover{
background:#e6f4f4 !important;
color:#069e98 !important;
}
.mq-flow-steps-v50{
margin-top:15px !important;
display:grid !important;
grid-template-columns:repeat(4,minmax(0,1fr)) !important;
gap:8px !important;
}
.mq-flow-step-v50{
min-height:40px !important;
padding:7px 9px !important;
display:flex !important;
align-items:center !important;
justify-content:center !important;
gap:7px !important;
border:1px solid #e1ebef !important;
border-radius:11px !important;
background:#f8fbfc !important;
color:#8095a5 !important;
font-size:10px !important;
font-weight:800 !important;
}
.mq-flow-step-v50.active{
border-color:#9fdfda !important;
background:#e9f9f7 !important;
color:#078d87 !important;
}
.mq-flow-step-v50.done{
border-color:#c7ebe8 !important;
background:#f0faf9 !important;
color:#4f8e8a !important;
}
.mq-flow-step-num-v50{
width:22px !important;
height:22px !important;
display:inline-flex !important;
align-items:center !important;
justify-content:center !important;
border-radius:50% !important;
background:#e5eef2 !important;
color:#547287 !important;
font-size:10px !important;
font-weight:900 !important;
}
.mq-flow-step-v50.active .mq-flow-step-num-v50{
background:#08b9b0 !important;
color:#fff !important;
}
body.mq-flow-open-v50 .mq-flow-selector-v50 .confiFormsFormContent{
padding:26px 26px 14px !important;
}
body.mq-flow-open-v50 .mq-flow-selector-v50 td{
padding:9px 10px !important;
}
body.mq-flow-open-v50 .mq-flow-selector-v50 .select2-container,
body.mq-flow-open-v50 .mq-flow-selector-v50 input[type="text"],
body.mq-flow-open-v50 .mq-flow-selector-v50 select{
min-height:48px !important;
}
.mq-flow-footer-v50{
padding:14px 22px 22px !important;
display:flex !important;
align-items:center !important;
justify-content:space-between !important;
gap:12px !important;
flex-wrap:wrap !important;
background:#fff !important;
border-top:1px solid #edf3f6 !important;
}
.mq-flow-footer-left-v50,
.mq-flow-footer-right-v50{
display:flex !important;
align-items:center !important;
gap:9px !important;
flex-wrap:wrap !important;
}
.mq-flow-primary-v50,
.mq-flow-secondary-v50,
.mq-flow-plus-v50{
min-height:42px !important;
padding:0 17px !important;
border-radius:11px !important;
font-family:Tahoma,Arial,sans-serif !important;
font-size:12px !important;
font-weight:900 !important;
cursor:pointer !important;
}
.mq-flow-primary-v50,
.mq-flow-plus-v50{
border:1px solid #08aaa4 !important;
background:linear-gradient(135deg,#08b9b0,#069e98) !important;
color:#fff !important;
box-shadow:0 8px 18px rgba(8,185,176,.16) !important;
}
.mq-flow-secondary-v50{
border:1px solid #d7e5eb !important;
background:#fff !important;
color:#536f84 !important;
}
.mq-flow-create-actions-v50{
padding:0 22px 20px !important;
display:flex !important;
justify-content:flex-start !important;
background:#fff !important;
}
body.mq-flow-open-v50 .select2-drop,
body.mq-flow-open-v50 .select2-dropdown,
body.mq-flow-open-v50 .aui-select2-drop{
z-index:2147483200 !important;
}
@media(max-width:760px){
body.mq-flow-open-v50 .mq-flow-active-panel-v50{
width:96vw !important;
max-width:96vw !important;
max-height:92vh !important;
border-radius:16px !important;
}
.mq-flow-steps-v50{
grid-template-columns:repeat(2,minmax(0,1fr)) !important;
}
.mq-flow-footer-v50{
align-items:stretch !important;
flex-direction:column !important;
}
.mq-flow-footer-left-v50,
.mq-flow-footer-right-v50{
width:100% !important;
}
}
</style>
<style id="mq-v50-1-horizontal-scroll-fix">
/* ============================================================
MEDIQ V50.1 - REMOVE HORIZONTAL SCROLL FROM TOP-DOWN FORMS
============================================================ */
body.mq-flow-open-v50 .mq-flow-active-panel-v50{
overflow-x:hidden !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormContent,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormFooter,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 form,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 form.aui-confiforms,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .table-wrap,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .aui,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .field-group,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .control-group{
width:100% !important;
max-width:100% !important;
min-width:0 !important;
box-sizing:border-box !important;
overflow-x:hidden !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormContent{
overflow-y:visible !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .table-wrap{
overflow-y:visible !important;
margin:0 !important;
padding:0 !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 table{
width:100% !important;
max-width:100% !important;
min-width:0 !important;
table-layout:fixed !important;
margin:0 !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 td,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 th{
min-width:0 !important;
max-width:100% !important;
overflow:hidden !important;
word-break:break-word !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 td > *,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 th > *{
max-width:100% !important;
min-width:0 !important;
box-sizing:border-box !important;
}
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-container,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-choice,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .select2-selection,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .aui-select2-choice,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input[type="text"],
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input[type="number"],
body.mq-flow-open-v50 .mq-flow-active-panel-v50 input[type="date"],
body.mq-flow-open-v50 .mq-flow-active-panel-v50 textarea,
body.mq-flow-open-v50 .mq-flow-active-panel-v50 select{
width:100% !important;
max-width:100% !important;
min-width:0 !important;
box-sizing:border-box !important;
}
/* prevent old/stale Select2 menus from remaining at the page corner */
body.mq-flow-open-v50 .select2-drop:not(.select2-drop-active),
body.mq-flow-open-v50 .aui-select2-drop:not(.select2-drop-active),
body.mq-flow-open-v50 .select2-dropdown[aria-hidden="true"]{
display:none !important;
}
@media(max-width:760px){
body.mq-flow-open-v50 .mq-flow-active-panel-v50 .confiFormsFormContent{
padding-left:14px !important;
padding-right:14px !important;
}
}
</style> |