From 7783e4193ad67118ca744c5c78c53cee44827cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsirafovics=20=28Gy=C3=B6rgy=20T=C3=B3th-Szab=C3=B3=29?= Date: Tue, 20 Jan 2026 15:00:49 +0100 Subject: [PATCH 1/3] create new blue theme, new logo, add icons --- css/blue.css | 1362 +++++++++++++++++ favicon.ico | Bin 42398 -> 9662 bytes images/cal.gif | Bin 127 -> 1166 bytes images/down.png | Bin 696 -> 386 bytes images/icons.svg | 92 ++ images/no_cal.gif | Bin 139 -> 1193 bytes images/sql-ledger.eps | 3246 ++++++----------------------------------- images/sql-ledger.gif | Bin 3825 -> 3818 bytes images/sql-ledger.png | Bin 14245 -> 19575 bytes images/up.png | Bin 709 -> 591 bytes 10 files changed, 1901 insertions(+), 2799 deletions(-) create mode 100644 css/blue.css create mode 100644 images/icons.svg diff --git a/css/blue.css b/css/blue.css new file mode 100644 index 000000000..3abf67cf0 --- /dev/null +++ b/css/blue.css @@ -0,0 +1,1362 @@ +/* Blue Theme for SQL-Ledger + * + * © 2026 Zsirafovics (György Tóth-Szabó) */ + +@import url("env.css"); + +/* general stuff */ +:root { + --base-font: SUSE, "Open Sans", system-ui, -apple-system, BlinkMacSystemFont, sans-serif; + --color-default: #0057AE; + --color-d1: #004E9C; + --color-d2: #00458B; + --color-d3: #003D79; + --color-d4: #003468; + --color-d5: #002B57; + --color-l1: #0078F1; + --color-l2: #359AFF; + --color-l3: #78BCFF; + --color-l4: #BCDDFF; + --color-l5: #EBF5FF; + --color-focus-bg: #FFFFD8; + --color-text-default: #333333; + --color-text-invert: #FFFFFF; + --color-text-muted: #666666; + --color-border-default: #D0D7E2; + --color-border-input: #B8C3D6; + --color-bg-default: #FEFEFF; + --color-bg-list: #F9F9F9; + --color-bg-admin: #FBFFE7; + --color-success: #008060; + --color-warning: #F9A825; + --color-error: #C20000; +} + +@media screen { + .noscreen { + display: none; + } +} + +@media print { + * { + background: none !important; + box-shadow: none !important; + } + .noprint { + display: none; + } + .buttons { + display: none; + } +} + +A:link, +A:visited { + color: var(--color-default); + text-decoration: none; +} + +A:active { + color: var(--color-default); + text-decoration: underline; +} + +A:hover { + text-decoration: underline; +} + +/* definitions */ +body { + font-family: var(--base-font); + font-size: 1rem; + line-height: 1.5; + color: var(--color-text-default); + background-color: var(--color-bg-default); +} + +table { + border-collapse: collapse; +} + +th, +td { + padding: 6px 8px; + vertical-align: middle; +} + +th { + vertical-align: middle; + font-weight: 600; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: 600; + color: inherit; +} + +h1 { font-size: 1.5rem; line-height: 1.3; } +h2 { font-size: 1.25rem; line-height: 1.35; } +h3 { font-size: 1.125rem; line-height: 1.4; } +h4 { font-size: 1rem; line-height: 1.45; } +h5 { font-size: 0.875rem; line-height: 1.5; } +h6 { font-size: 0.75rem; line-height: 1.5; } + +label { + display: inline-block; + font-size: 0.875rem; + font-weight: 500; + margin-bottom: 0.25rem; + color: var(--color-text-default); +} + + +/* base classes */ + +.card { + box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19); + padding: 10px; + text-align: center; + border-radius: 6px; +} + +.button { + font-family: inherit; + font-size: 0.875rem; + font-weight: 600; + font-variant: small-caps; + line-height: 1; + padding: 0.4rem 0.8rem; + + background-color: var(--color-default); + color: var(--color-text-invert); + + border: 1px solid var(--color-d3); + border-radius: 4px; + + cursor: pointer; + + transition: + background-color 0.15s ease, + box-shadow 0.15s ease, + transform 0.05s ease; +} + +input[type="submit"]:not(.button), +input[type="button"]:not(.button), +button:not(.button) { + font-family: inherit; + font-size: 0.875rem; + font-weight: 600; + font-variant: small-caps; + line-height: 1; + padding: 0.4rem 0.8rem; + + background-color: var(--color-default); + color: var(--color-text-invert); + + border: 1px solid var(--color-d3); + border-radius: 4px; + + cursor: pointer; +} + +.button:hover, +input[type="submit"]:not(.button):hover, +input[type="button"]:not(.button):hover, +button:not(.button):hover { + background-color: var(--color-d3); + box-shadow: 0 4px 10px rgba(0, 87, 174, 0.35); + transform: translateY(-3px); +} + +.button:active, +input[type="submit"]:not(.button):active, +input[type="button"]:not(.button):active, +button:not(.button):active { + background-color: var(--color-d3); + box-shadow: 0 2px 6px rgba(0, 87, 174, 0.45); + transform: translateY(3px); +} + +.button:focus-visible, +input[type="submit"]:not(.button):focus-visible, +input[type="button"]:not(.button):focus-visible, +button:not(.button):focus-visible { + outline: none; + background-color: var(--color-focus-bg); + color: var(--color-text-default); + box-shadow: 0 0 0 3px rgba(0, 87, 174, 0.35); +} + +.image-hover { + display: inline-block; + cursor: pointer; + transition: + box-shadow 0.15s ease, + transform 0.15s ease, + opacity 0.15s ease; +} + +.image-hover:hover { + opacity: 0.25; +} + +A:focus-visible .image-hover { + opacity: 0.25; +} + +.small, +.help-text { + font-size: 0.875rem; + color: var(--color-text-muted); +} + +.smallcaps { + font-variant: small-caps; +} + +.ai-row { + display: flex; + gap: 1rem; +} + +.ai-half { + flex: 1 1 50%; +} + +.flip-card { + width: 100%; + max-width: 520px; + height: 200px; + margin: 0 auto; +} + +.flip-card-inner { + position: relative; + width: 100%; + height: 100%; + transform-style: preserve-3d; + transition: transform 0.6s ease; + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2); + border-radius: 6px; +} + +.flip-card:hover .flip-card-inner, +.flip-card:focus-within .flip-card-inner { + transform: rotateY(180deg); +} + +.flip-card-front, +.flip-card-back { + position: absolute; + inset: 0; + backface-visibility: hidden; + -webkit-backface-visibility: hidden; + background-color: var(--color-bg-default); + border-radius: 6px; +} + +.flip-card-back { + transform: rotateY(180deg); +} + +.flip-logo { + max-height: 140px; + width: auto; +} + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + + +/* menu stuff */ + +body.app { + margin: 0; +} + +.app-frames { + display: flex; + width: 100vw; + height: 100vh; +} + +.app-pane { + height: 100%; +} + +.app-pane--menu { + flex: 0 0 var(--menu-width, 275px); + background-color: var(--color-bg-list); + border-right: 1px solid var(--color-border-default); + + position: relative; + z-index: 2; + + box-shadow: + 6px 0 12px rgba(0, 0, 0, 0.10), + 1px 0 2px rgba(0, 0, 0, 0.06); +} + +.app-pane--main { + flex: 1 1 auto; + position: relative; + z-index: 1; +} + +.app-pane > iframe { + width: 100%; + height: 100%; + border: 0; + display: block; +} + +body.menu { + margin: 0; + padding: 0.5rem 0; + background-color: var(--color-bg-list); + color: var(--color-text-default); + font-family: var(--base-font); + font-size: 0.875rem; +} + +body.menu header { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0 10px 10px; + border-bottom: 0; +} + +body.menu header img { + display: block; +} + +body.menu .menu-user { + font-weight: 600; +} + +body.menu nav { + padding-top: 0.25rem; +} + +body.menu .menu-header { + display: block; + width: 100%; + text-align: left; + + font: inherit; + font-variant: normal; + line-height: 1.2; + + position: relative; + padding: 6px 2.25rem 6px 10px; + font-weight: 700; + cursor: pointer; + + border: 0; + border-top: 1px solid var(--color-border-default); + border-radius: 0; + + background-color: transparent; + color: var(--color-text-default); + + box-shadow: none; + transform: none; + + transition: background-color 0.15s ease, color 0.15s ease; +} + +body.menu .menu-header::after { + content: "+"; + position: absolute; + right: 0.55rem; + top: 50%; + transform: translateY(-50%); + width: 1.15rem; + height: 1.15rem; + border-radius: 999px; + border: 1px solid currentColor; + display: grid; + place-items: center; + font-weight: 800; + line-height: 1; + opacity: 0.9; +} + +body.menu .menu-header:hover::after, +body.menu .menu-header:focus-visible::after { + opacity: 1; +} + +body.menu .menu-header[aria-expanded="true"]::after, +body.menu .menu-header.open::after { + content: "–"; +} + +body.menu .menu-header:hover { + background-color: var(--color-l4); + color: var(--color-text-default); + box-shadow: none; + transform: none; + text-decoration: none; +} + +body.menu .menu-header:active { + box-shadow: none; + transform: none; +} + +body.menu .menu-header:focus-visible { + outline: none; + background-color: var(--color-focus-bg); + color: var(--color-text-default); + box-shadow: 0 0 0 2px rgba(0, 87, 174, 0.25); +} + +body.menu .menu-header.open, +body.menu .menu-header[aria-expanded="true"] { + background-color: var(--color-l4); + color: var(--color-text-default); +} + +body.menu .menu-header.open::before, +body.menu .menu-header[aria-expanded="true"]::before { + content: ""; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 4px; + background-color: var(--color-default); +} + +body.menu header.menu-headerbar { + display: flex; + justify-content: center; + align-items: center; + padding: 10px 10px 12px; + width: 100%; +} + +body.menu .submenu { + display: block; + margin-left: 10px; + border-left: 2px solid var(--color-border-default); + padding-left: 8px; + position: relative; +} + +body.menu.menu--js .submenu { + display: none; +} + +body.menu.menu--js .submenu.open { + display: block; +} + +body.menu.menu--js .menu-header.open + .submenu { + display: block; +} + +body.menu .menu-item a { + display: block; + position: relative; + padding: 5px 10px 5px 1.25rem; + font-weight: 500; + color: var(--color-default); + text-decoration: none; +} + +body.menu .menu-item:hover { + background-color: var(--color-l4); +} + +body.menu .submenu .menu-item a::before { + content: ""; + position: absolute; + left: 0; + top: 50%; + width: 0.75rem; + border-top: 1px solid var(--color-border-default); + transform: translateY(-50%); + opacity: 0.8; +} + +body.menu .menu-item a::after { + content: "›"; + position: absolute; + left: 0.35rem; + top: 50%; + transform: translateY(-50%); + opacity: 0; + transition: opacity 0.12s ease; + font-weight: 800; + line-height: 1; +} + +body.menu .menu-item a:hover::after, +body.menu .menu-item a:focus-visible::after { + opacity: 1; +} + +body.menu .menu-item a:hover { + color: var(--color-d3); + text-decoration: underline; +} + +body.menu .menu-item a:focus-visible { + outline: none; + background-color: var(--color-focus-bg); + box-shadow: 0 0 0 2px rgba(0, 87, 174, 0.25); + border-radius: 3px; +} + +body.menu .menu-item.active a { + background-color: var(--color-default); + color: var(--color-text-invert); + font-weight: 700; + border-radius: 20px; + margin: 2px 6px 2px 6px; + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.85); + text-decoration: none; +} + +body.menu .menu-root-actions { + margin-top: 12px; + padding-top: 10px; + padding-left: 10px; + padding-right: 10px; + border-top: 1px solid var(--color-border-default); + display: flex; + flex-direction: column; + align-items: center; +} + +body.menu .menu-root-actions .menu-item--root { + margin: 6px 0; +} + +body.menu .menu-root-actions .menu-item a { + padding-left: 10px; +} + +body.menu .menu-root-actions .menu-item--root a { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 4px 10px; + font-weight: 700; + background-color: var(--color-l5); + color: var(--color-text-default); + border: 1px solid var(--color-border-default); + border-radius: 6px; + margin: 0; + text-decoration: none; + width: fit-content; + line-height: 1.1; +} + +body.menu .menu-root-actions .menu-item--root a:hover { + background-color: var(--color-default); + color: var(--color-text-invert); + text-decoration: none; +} + +body.menu .menu-root-actions .menu-item a::before, +body.menu .menu-root-actions .menu-item a::after { + content: none; +} +body.menu .menu-root-actions .menu-item a { + padding-left: 10px; +} + +body.menu .menu-env { + display: inline-block; + width: auto; + background-color: var(--color-env); + color: var(--color-text-invert); + border-radius: 6px; + text-align: center; + font-variant: small-caps; + padding: 8px 10px; + line-height: 1.25; +} + +body.menu .menu-env-line--env { + font-weight: 800; + margin-bottom: 2px; +} + +body.menu .menu-env b { + font-variant: normal; +} + +body.menu .menu-user { + text-align: center; + font-weight: 600; +} + + +/* input stuff */ + +input:not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="file"]):not([type="range"]):not([type="color"]):not([type="image"]), +select, +textarea { + font-family: inherit; + font-size: 0.875rem; + line-height: 1.2; + + padding: 0.2rem 0.4rem; + + border: 1px solid var(--color-border-default); + border-top-color: #EFEFEF; + border-bottom-color: var(--color-border-input); + border-radius: 4px; + + background-color: #FFFFFF; + background-image: linear-gradient( + to bottom, + #FFFFFF 0%, + #FAFBFF 100% + ); + + color: var(--color-text-default); + + box-shadow: + 0 2px 2px rgba(0, 0, 0, 0.06), + inset 0 0 0 1px rgba(255,255,255,0.6); + + transition: + border-color 0.15s ease, + box-shadow 0.15s ease, + background-color 0.15s ease; +} + +input:not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="file"]):not([type="range"]):not([type="color"]):not([type="image"]):hover, +select:hover, +textarea:hover { + background-color: var(--color-l5); + border-color: var(--color-l3); + background-image: none; +} + +input:not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="file"]):not([type="range"]):not([type="color"]):not([type="image"]):focus, +select:focus, +textarea:focus { + outline: none; + background-color: var(--color-focus-bg); + border-color: var(--color-default); + background-image: none; + + box-shadow: + 0 0 0 2px rgba(0, 87, 174, 0.25), + 0 2px 4px rgba(0, 0, 0, 0.12); +} + +input:not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="file"]):not([type="range"]):not([type="color"]):not([type="image"]):focus-visible, +select:focus-visible, +textarea:focus-visible { + outline: none; + box-shadow: 0 0 0 2px rgba(0, 87, 174, 0.25); +} + +input:required, +select:required, +textarea:required { + background-color: #fffde7; +} + +input.error { + background-color: var(--color-error); +} + +table tr { + line-height: 1.2; +} + +table th, +table td { + padding: 4px 8px; + vertical-align: middle; +} + +table th { + font-size: 0.9rem; + font-weight: 500; + white-space: nowrap; +} + +table td input:not([type="submit"]):not([type="button"]):not([type="reset"]), +table td select, +table td textarea { + font-size: 0.8125rem; + padding: 0.15rem 0.35rem; + line-height: 1.2; +} + +table table { + border-collapse: collapse; +} + +table table th, +table table td { + padding: 4px 6px; +} + +.tcalIcon { + vertical-align: middle; + margin-left: 2px; +} + +.validation-failed { + border-color: var(--color-error); + background-color: #ffecec; +} + +.validation-passed { + border-color: var(--color-success); +} + +input[type="checkbox"], +input[type="radio"] { + accent-color: var(--color-default); + margin-right: 0.4rem; +} + +input[type="checkbox"]:focus-visible, +input[type="radio"]:focus-visible { + outline: 2px solid var(--color-default); + outline-offset: 2px; +} + +input[type="checkbox"]:disabled, +input[type="radio"]:disabled { + opacity: 0.6; + cursor: not-allowed; +} + + +/* lists stuff */ + +.list { + border: 1px solid var(--color-d3); + background-color: var(--color-l5); + font-size: 0.875rem; + color: var(--color-d3); +} + +.listtop { + position: relative; + border-bottom: 2px solid var(--color-d5); + background-color: var(--color-l3); + font-size: 1.125rem; + font-weight: 700; + font-variant: small-caps; + color: var(--color-text-invert); + text-align: left; + padding: 0.5rem 0.75rem; +} + +.listheading, +.sectionheading { + background-color: var(--color-l5); + font-size: 0.875rem; + font-weight: 600; + color: var(--color-text-default); +} + +.sectionheading { + font-size: 0.75rem; +} + +.listheading th { + position: relative; + border-bottom: 2px solid var(--color-border-default); + padding: 0.3rem 0.5rem; + text-align: left; +} + +.listheading th:not(:last-child)::after { + content: ""; + position: absolute; + top: 20%; + bottom: 20%; + right: 0; + + width: 2px; + background-color: var(--color-border-default); +} + +.listheading th a, +.sectionheading th a { + color: var(--color-default); + text-decoration: underline; +} + +.listheading th a { + text-decoration-thickness: 2px; + text-underline-offset: 2px; +} + +.listheading th a:hover, +.sectionheading th a:hover { + background-color: var(--color-d5); + color: var(--color-text-invert); + text-decoration: none; +} + +.listrow0 td, +.listrow1 td { + position: relative; + border-bottom: 1px solid var(--color-border-default); + padding: 0.4rem 0.8rem; +} + +.listrow0 td:not(:last-child)::after, +.listrow1 td:not(:last-child)::after { + content: ""; + position: absolute; + top: 20%; + bottom: 20%; + right: 0; + + width: 2px; + background-color: var(--color-border-default); + opacity: 0.4; +} + +.listrow0 td { + background-color: var(--color-text-invert); +} + +.listrow1 td { + background-color: var(--color-bg-list); +} + +.listrow0:hover td, +.listrow1:hover td { + background-color: var(--color-l4); +} + +.listrow0 td a, +.listrow1 td a { + color: var(--color-d2); + font-weight: 600; + text-decoration: none; +} + +.listrow0 td a:hover, +.listrow1 td a:hover { + cursor: pointer; + color: var(--color-text-invert); + background-color: var(--color-d5); +} + +.listrow0 td a::before, +.listrow1 td a::before { + content: "›"; + display: inline-block; + width: 0.4em; +} + +.listrow0 td a:focus-visible, +.listrow1 td a:focus-visible { + outline: none; + background-color: var(--color-focus-bg); + box-shadow: 0 0 0 2px var(--color-default); + border-radius: 3px; +} + +.listsubtotal { + font-size: 0.75rem; + color: var(--color-text-default); + font-style: italic; +} + +.listtotal { + font-size: 0.875rem; + color: var(--color-text-default); + font-weight: 700; +} + + +/* login stuff */ + +.login-wrapper { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; +} + +.login-column { + width: 100%; + max-width: 520px; + margin: auto; + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.login-brand, +.login-env, +.login-form { + text-align: center; +} + +.login-env { + background-color: var(--color-env); + color: var(--color-text-invert); + border-radius: 6px; +} + +.login-env-header h1, +.login-env-header h3 { + margin: 0; +} + +.login-quote { + margin-top: 1.5rem; + padding: 0.75rem 1rem; + font-style: italic; + font-weight: 500; + font-size: 0.95rem; + opacity: 0.85; + text-align: center; +} + +.login-form .card { + margin-bottom: 1.25rem; +} + +.login-form .card:last-child { + margin-bottom: 0; +} + +.login-input { + border-color: var(--color-border-default); + box-shadow: 0 1px 3px rgba(0,0,0,0.08); + box-sizing: border-box; + font-size: 1.2rem; +} + +.login-input:focus { + background-color: var(--color-focus-bg); + border-color: var(--color-default); + box-shadow: + 0 0 0 2px rgba(0, 87, 174, 0.25); +} + +.login-field { + margin-bottom: 1rem; +} + +.login-field.floating { + position: relative; + margin: 1.2rem 0; +} + +.login-field.floating input, +.login-field.floating select { + height: 3.25rem; + width: 70%; + padding: 0 0.75rem; + font-size: 1.2rem; + margin: 0 auto; + line-height: normal; +} + +.login-field.floating label { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + color: var(--color-text-muted); + font-size: 1.2rem; + pointer-events: none; + transition: all 0.2s ease; + background: transparent; +} + +.login-field.floating input:focus + label, +.login-field.floating input:not(:placeholder-shown) + label { + top: -0.4rem; + transform: translateX(-50%); + font-size: 0.75rem; + color: var(--color-default); + background: var(--color-text-invert); + padding: 0 4px; +} + +.login-field.floating input:focus + label { + font-weight: 600; +} + +.login-field.floating select + label, +.login-field.floating .floating-label { + top: -0.4rem; + left: 50%; + transform: translateX(-50%); + font-size: 0.75rem; + color: var(--color-default); + background: var(--color-text-invert); + padding: 0 4px; +} + +.login-field.floating select { + padding-top: 20px; +} + +.login-static { + width: 70%; + margin: 0 auto; + padding: 0.75rem 0.75rem; + border: 1px solid var(--color-border-default); + border-radius: 4px; + background-color: var(--color-l5); + color: var(--color-text-default); + box-shadow: 0 1px 2px rgba(0,0,0,0.08); + text-align: center; +} + +.login-field.floating .login-static { + width: 70%; + margin: 0 auto; + padding: 0.9rem 0.75rem 0.4rem; + border: 1px solid var(--color-border-default); + border-radius: 4px; + background-color: var(--color-l5); + color: var(--color-text-default); + box-shadow: 0 1px 2px rgba(0,0,0,0.08); + font-weight: 600; +} + +.login-field.floating .login-static + label { + top: -0.4rem; + transform: translateX(-50%); + font-size: 0.75rem; + color: var(--color-default); + background: #ffffff; + padding: 0 4px; +} + +.login-button { + padding: 0.4rem 1.2rem; + font-size: 1.2rem; + line-height: 1.5; + border-radius: 6px; +} + +.totp-setup { + margin: 1rem auto; + text-align: center; +} + +.totp-qrcode { + margin: 0.8rem auto; +} + +.totp-qrcode svg { + max-width: 100%; + height: auto; +} + +.totp-secret { + font-family: monospace; + font-size: 0.9rem; + color: var(--color-text-default); + background-color: var(--color-bg-default); + border: 1px solid var(--color-border-default); + border-radius: 4px; + padding: 0.4rem 0.6rem; + display: inline-block; +} + +.capslock-warning { + margin-top: 0.25rem; + font-size: 0.95rem; + color: var(--color-warning); + font-weight: 600; +} + +.login-dataset { + padding: 1rem 1.2rem; +} + +.login-dataset-header { + display: flex; + align-items: center; + justify-content: center; + gap: 0.75rem; + margin-bottom: 0.75rem; +} + +.dataset-icon { + width: 28px; + height: 28px; + color: var(--color-default); + flex-shrink: 0; +} + +.dataset-text { + display: flex; + flex-direction: column; +} + +.dataset-label { + font-size: 0.95rem; + font-weight: 600; + line-height: 1.2; +} + +.login-dataset select:hover { + border-color: var(--color-l3); +} + +.login-dataset select:focus { + border-color: var(--color-default); + box-shadow: 0 0 0 2px rgba(0, 87, 174, 0.25); +} + + +/* administration pages */ + +body.admin { + background-color: var(--color-bg-admin); + color: var(--color-text-default); +} + +.admin-wrapper { + min-height: 100vh; + padding: 1.5rem; + display: flex; + justify-content: center; +} + +.admin-column { + width: 100%; + max-width: 1100px; + display: flex; + flex-direction: column; + gap: 1rem; +} + +.admin-card { + text-align: left; +} + +.admin .admin-form { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.admin .admin-title { + margin: 0; + font-size: 1.25rem; + line-height: 1.2; +} + +.admin .admin-grid { + display: grid; + grid-template-columns: 200px minmax(0, 1fr); + gap: 0.75rem 1rem; + align-items: center; +} + +.admin .admin-label { + justify-self: end; + font-weight: 600; +} + +.admin .admin-field { + min-width: 0; +} + +.admin .admin-existing { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.admin .admin-chip { + display: inline-flex; + align-items: center; + gap: 0.35rem; + padding: 0.15rem 0.5rem; + border: 1px solid var(--color-border-default); + border-radius: 999px; + background-color: var(--color-bg-list); + font-size: 0.95rem; +} + +.admin .admin-actions { + display: flex; + gap: 0.5rem; + flex-wrap: wrap; +} + +.admin .divider { + border: 0; + border-top: 1px solid var(--color-border-default); + margin: 0.5rem 0 0; +} + +.admin .admin-table { + overflow: auto; +} + +.admin .admin-table table { + width: 100%; +} + +.admin .align-center { + text-align: center; +} + +.admin .align-right { + text-align: right; +} + +.admin .admin-static { + padding: 0.25rem 0.5rem; + background-color: var(--color-bg-list); + border: 1px solid var(--color-border-default); + border-radius: 4px; + min-height: 1.6em; + white-space: pre-wrap; +} + +.admin .col-locked { + width: 1%; + white-space: nowrap; +} + +@media (max-width: 640px) { + .admin .admin-grid { + grid-template-columns: 1fr; + } + .admin .admin-label { + justify-self: start; + } +} + + +/* main frame */ + +.plus0 { /* negatív */ + background-color: var(--color-error); + color: var(--color-text-invert); + padding: 0.15rem 0.5rem; + border-radius: 3px; + font-weight: 600; +} + +.plus1 { /* pozitív */ + background-color: var(--color-success); + color: var(--color-text-invert); + padding: 0.15rem 0.5rem; + border-radius: 3px; + font-weight: 600; +} + +h2.confirm { + height: 100px; + background-image: url(../images/warning.png); + background-repeat: no-repeat; + padding-left: 100px; + color: var(--color-error); + font-size: 36px; +} + +.confirm, +.error, +.ok { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.75rem 1rem; + border-radius: 6px; + font-weight: 600; +} + +.confirm { + color: var(--color-error); +} + +.confirm::before { + content: ""; + width: 48px; + height: 48px; + background: url(../images/warning.png) no-repeat center / contain; +} + +.error { + background-color: var(--color-error); + color: var(--color-text-invert); +} + +.ok { + color: var(--color-success); +} + +.ok::before { + content: ""; + width: 32px; + height: 32px; + background: url(../images/checkmark.png) no-repeat center / contain; +} + +.dnd-idle { + text-align: left; + vertical-align: top; +} + +.dnd-active { + text-align: center; + vertical-align: middle; + border: 1px dashed var(--color-border-default); + background-color: var(--color-l5); +} + +.nkp { + display: none; +} + +.printonly { + display: none; +} + +.service_portal_warning { + font-size: 1.25rem; + font-weight: 700; +} + +.service_portal_warning a { + color: var(--color-text-default); + text-decoration: underline; +} + +.dberror { + display: none; +} + +.redirectmsg { + background-color: var(--color-l2); + color: var(--color-text-invert); + padding: 0.25rem 0.5rem; + font-weight: 600; +} + +--------------------------------------------------------------------------- diff --git a/favicon.ico b/favicon.ico index 1b1906e968b5371bfef686f3ad426efcd5177a75..fb6df3a41d4629e7d9801d70ea7beae6f6ba6c88 100644 GIT binary patch literal 9662 zcmeI2duWzb9LLWtXlQLtX@Nz}rgo2+p{cvIs0<6jyg|4oiIJJQa8drzwr0bGX4nu5 z-F@L71(p$35U*Poh{}q}vJ0!NAW>V*%4+WI^F7Zw@$}|$jPZ`-dF1o{F6Z~0^E6ZA7$+NUflQ6pRA5rj=fQm76lDx@98|!q zErljkzVNkkZrHN%pAdVuyvS6@hoa^JlkOw2uY}vZJsipXX>bsZKsS`Z?Uj37YrgGoF1l*41T?Rc zpd<9KF7BNI8dpbf(^zE3(D+|K19eSryV3gY!`4`9Sp%x|i*Oj0!x+#U)z1PbhCZkV ztwp`lU%}SqB0HZ+=$h}RpqlJqoRr~AfP2pY)tfAX3tjcq*iS=E$bT=k#>;_?pnR9B zy{X9NxfxsY&Vp)qPHjl7rR`3xaXyXvCTRVsUJt`8$W{ALFXpZOzk}8O9`wuM7(50C zy}v1_rRJvR|2C+`c8x2hvDnVx8GKq#kHEK}^-}26`r2V4CWJyaN7SXXsNw&*gb&fTi#%^usKd|1|U%Yyz#-FpGzpb7EXek=@@` z)8AY06lk4l%}S3a@C){Wa39#$!|{YTe_u^I`?xOJ=MEC1*k^;N;s4UdJ)k`#-_>|K zy7mpddpZl~8?UjBf;~I1ADxB%jq@Ksu7SPIR_y&gBXpntALz9SEcJ0CCF%eC@OJ`x zA{+zdwM^q67dpEac`j(5{u~BCaqse;+Y8<2e?0Ic|Cby(TwZoxL*M4?W@UrE!PyTw zsc+qQ*EXv8lZVb=M_gW|E~i(Vz0TQb*tazY-zL2)dIndGcK+^Ly36IGv!>lUksmtW z66F}a@b|d38{|hHmHIQTYN|a}wGpo}KyCKSj!b&~oE^t7?rxWd za?v*+yzlGGBLB^PPF~{k`_&>hpQPr`_^SI0p#1c`t!Q$4c__y&*FN9-yu|PGUpPwn z>-_6;UwNwYNGM0UMttrr-!H>+Lr-@7KXT*O$HR$*blUg3n6i-Ds`&k0b*&uO$HhG^Uw!U@p>pSMpyvfdA=LF?o*KasKuhX{5#eBe7KKx#nI{zW< zy>3p)&cEH|pgl4lbT-i6KJ}sev$6emN@p6?UFU1R_g9Bvlb!z*@;D5724TMUIk~!4 zB((cj{cStJ$D$`Sf0x^I#?>C$2fu^f=?8pHlC8mizgmf3`=#C)o$=aWaySnAYIp}a z!v08)DiBp5sz6kMr~*+1&YTLw?Pbi!$$`u`e@MjR{bMEjOD^o0i9BIUdR8D!iewcv zlIXNk6uGle`R01l9>L=tax0pWfL;vG5%ks7_t|;D$kCSS4F$} y*&N7TC%ftbd;iuzRy&#IEuOT)&}t@RWoeADX~CS$I7iea&=Nq#{2~!SM`$s literal 42398 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 QJFRT=8k(sJ7m7x?Tt&qQp`d2*Kx4cE6kW<9 ziu%H;BsPoL_`;*GDB^*wlrm7LEh;H4c9GR$vGkbv%}nR|Rs1V_<2Rqb;7OkJj5NiH z!Z;)j8Py=jU0>9FU-W(7v}XVGfBdsr{L%-3pIQTR+XBf?f(xGpe{K&hYsZ&A$5%YZ zR~qrvMtqG4SH8g4y}*Czz}I&WX=WnbOsLF6hMCx8AvRlx%n4l}yNk%_B62aX1p~if zU~4zn)(!Hy!S)F~U`G$gw}M?(u)7x&_JX25Qr$-u_mL$wa*vJNYa{o)B!7QN?zfW% z?Bu}-4)TzLJkn1cdqtgiO`U#2oq0o*4^S0f(Uk-AIVb&xldg8sHG}k@gLK_n`tnfd zsw<>(g>DWrf4ygJjW7l`+vH}O-E7M!+xCfl>|vjH*ry)u*%;S8#u-0z9bT@}%UQ;` z9v^4(^RI*a0M0uJ{w*Q=O9(?icn1U*5dNox50vnc7TmNjN(-Mtf+qyWLhv&Ky$l>@ zppS)q76w=tWFgK$f`fpABo8Sb(mZ5@Fe`*P80KMEfMFQ^-Zxu7#)w5zkT8;hO!V~= z2nrDqnxHc1O;xBQNu1T0d8ulKOE=$OsMXJnUW8mPLS(ZR&S^n&d`M~Y%lJrg2SLO{GP4SXalTMX#JJFFCSsRhOrBqu# z5`nfx6uB@tdZBKu1|9YuUY~U%rascrD=NOA`|$uD<6KhRb8&gWg0oSvN2(*GNz)(c zWd%_&Kg8tgj;HQiTx``XojT69J<=y+d+TdN^XwICj@}X1NYWnu*Qz;Qx>njGQlc|N z8?-t-@@sUo?O;JLzcI6Rw`7L>2ZrO8HSV(m7Ru%MB9m0w3RFI#mAlok@nzVeuG&-!+L%xlYPHuXMx?RGsxKNLNVot1 literal 127 zcmZ?wbhEHb6krfwSj51v)Yr?)cd3`J*V1K6uU)?O9}E~67!-f9FfuT(G3WrDe9t*lgcyqV(DCY@~pS{(HJO zhFJ7Ion)Bh$T(f5m%(dM<+#m~O^ILA`F;q07Z z|BptSZ>kn^Ok4SmCC!2Hh58nu4{RkuRqj=q3%@ruF&6)wd$4!9q=tRJf453a3d>&Y za;9AyZ?M&w&WPcZI#tgSH~Fx5g8E?-2C0+f3{lU0coVcAt3L>`Nk04C!MNnF)rZ9g z!g*NcRGF-2k9#B^!EDA=$6Wc=V|^^^rv}jk-2*|trBGJ@gh bgzx-HY<`Tp=I`qR1_gtstDnm{r-UW|r6-SR literal 696 zcmV;p0!RIcP)32;bRa{vGf5&!@T5&_cPe*6Fc010+*L1zE}0bT$A0QvxHa@Gw1 z00KZsL_t(2&tv@m|NsC0{~5>vEDSFhUNF4;_v+vMe;=51nJk&qpB;PV{akJF`Xv#| z)_hC)Zt*S8#>PsmWH|m=8@JwUa~wpLQI}Dlsf)pf!I!~@>CfpuyZ@YirufwBnF2(b z^B|`d#}~tE#?!SHf`Q`Vam11|yW|NZ~>{onuZ%fFBRMIl0&6SMSk+xJHAS#U<{SO2e-|NkeYCH>1WI<0(0g<0r{!RQh8N$9Jdi(6H{@lGe&BX^Q87k(rU7c$^_w1bO5ZOPU|9t)P z0cP{>|G)qLhDu!cbM4Os2z&FYEk2u7i);$t71ly6*z<4KzZ3t@{XhHv%>Qryzy1FP z4Q+;B3_lruF|aYPGq5qZGB`1~F$gm7G4T9n{m=IQA44z03WkM@OpLD>e=&$LNHB;p e{Ac*j@E-t$-)Uctr!iar0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/no_cal.gif b/images/no_cal.gif index adc58e2a840ee4b95febddf7e9dcb0be27ea1ede..e1ac3b3d9341b504afacf3ddf51a451d6c38cd95 100644 GIT binary patch literal 1193 zcmZ?wbhEHblw^=(_`m=J{~7-OSNzGs$iNW5paT*B$sA{3WMne;=5`2Sa8G3L%VvnE z5KgR9jxN-SEzn41?2h)8YE%$%2Iq)f} ze{tA^Wz|hBB?~sV9RB2aZ%-OSmVA0aqOIIvhu?h$puYGU3@xA-z_bGRO%((Ys zeW5r8h6hfE+T|sbJU9+7n5=Hx^Cn@&qs|U>TZy88Lyt~QZc^Y|r81)^fw@hh&qh&* zrPFt|dxA~orAEcZCh>HIo084!&J3oLcy8`Iw8T-CM{`TY#zn2%LV7V9R=jFdWNzYP za1hW4K5)DbjedCsX9QY0Pww{XTJWJtXoaVmPm#fvhbk%zYz_L~R3)ac z_J|8guqDiBVBry0oAc}H0mHVF{r(f?Bvd$TJ}{l3z$EhQuC0@=uCMGp0`$)!UbTDe9t*l +] def +/f-0-0 currentdict end definefont pop +%%EndResource +%%BeginResource: font SegoeScript-Bold +11 dict begin +/FontType 42 def +/FontName /SegoeScript-Bold def +/PaintType 0 def +/FontMatrix [ 1 0 0 1 0 0 ] def +/FontBBox [ 0 0 0 0 ] def +/Encoding 256 array def +0 1 255 { Encoding exch /.notdef put } for +Encoding 100 /d put +Encoding 101 /e put +Encoding 174 /registered put +/CharStrings 4 dict dup begin +/.notdef 0 def +/e 1 def +/d 2 def +/registered 3 def +end readonly def +/sfnts [ +<00010000000900800003001063767420104621f400000648000001dc6670676d95c07f000000 +082400000950676c79661d1b979d0000009c000005ac68656164e82239ec0000117400000036 +6868656112e905b2000011ac00000024686d747815590138000011d0000000106c6f63610000 +0a58000011e0000000146d61787002a20568000011f400000020707265703b264e1b00001214 +000001f00002001f000003e105fc00030007001b400c0004120305000701010900042fcd1239 +2fcd003fcd3fcd31303721112103112111e70232fdcec803c2b40493fab905fcfa0400020092 +001d0581046b000c0040003d400c3e3e2316973333032323082eb8fff0400e2e08190d0d002e +191928000042411112392fcd332f3311332f1133002f38cd322f33322fed11392f3130013426 +27220e02073e030514070e0523222635343e02373e0333321e02151406070606071e0333323e +023736363737363332160275090a224d46370d2f5f4d31030c1b347f909ca09f4cabbf163352 +3c163b434924354d3218847526643e02192b3c26316e6c662a4a8940353727140f036b162805 +3a6b975c234d545d8412304b938471522fc1c34e97938e43192e24162843573059bf64204b2f +192c2113192a371e357b4035311b000000020039fffe06d906280026008d006b40352c2d2d8b +8b42603a103a5505051e6035957e7e521e97421560601252740d0874893a0805553a0d05053a +3a1c892727655a5a8f1c472fcd12392fcd322f33123911331133113311331112392f2f2f002f +cd322f3fed11392fed111239113333381112392f3311333130013e0337262635343e0235342e +0223220e020706060706151433323637363637363625140e0207350606070e0323222e02270e +0307060623222e02353436373636373e03333216173e0337363637363633321e0215140e0207 +140e0407060615141e02171e0333323e02373636373636373633321602cf0813131306151303 +040310171b0b184046451d202e11351614402b2d491a3846041f0a1b2d242553302e5c564c1e +4552311a0b1b3d43492664d370273a261308082b694d305e697a4c405211070d0c0a0405100c +103029192d23140a11180f0507070705010c100102040401080d120b0e2023210d3567343366 +270f1710150213091a1e1f0d0e2f180a1a1b18060d1d18103956662c32572372423c1c1d1f39 +1b394fb812232b3a2a012b552d2c4a361f406e9554295d5c56235b5b283f4b232f43177bdd6b +446847245e5426606a72384e6c141a220f171d0e0d34557b540620292c271c034e86431e4445 +441f0713110c0b1113092351302f592a0f1e0004004e005c071e05e40041007700b800cc0051 +4026126969493578ac78acb14f4fb1b1c3c3428cb99c9c9661492dbc878c96002d961e4242ce +611e2fcd12392f123939cd2fcd32392f331112392f33111239113311332f1139392f2f002fcd +332fcd3130011406070e0307060607060607060623272e05272e0335343e02373636373e0537 +363436363736363332161716161716171e0307342e042316161716161514072626272623220e +0207060607060615141e0217161633323e02373e0537363607140e02232226272e0323222714 +16161415140e0223222e0227113427262635343e02373e0333321617161615140e0207161617 +1e0301141617303e02373637342e0223220e02071e221f122d363c213e95534ca3534d983e7a +24545350412f0a060d0a062639421c244c1d0e38454c412e07020b1d1f45692547893f3f6a23 +334c2847351fc23c607a7c742a050c073c392f3a370d153321656e68242b572a33430b1d3328 +3e87412b403e4934104b606b624d125054d416202611244d351d39352d11050301010e1b2619 +14251e1303121512101b21111f4c493b0e42612b171913222f1c14181242553013fdff02020d +161d0f232e06101d1801181e1c03815d8c2d193e413d192f4627242c16140b080320323d403d +170f2e2f290b2f696a632733451309222b2f291f061c342c230b190d141313351d2b5a2e5e58 +4f48447c6d594023040805295119174b2c25010323353f1c21532e377136334e3d30141f2302 +080d0b0419252c2c280f42b1be0c1b17101a1c0d1b170e01031417140311312d20121b211001 +32201114220e0c1d1a1301050906043b361c29140d1e1e1a09060b0718211d1e010e13381607 +0b0e071115050f0f0b06090805fa001e000005aa001e00000546001e00000000000000000000 +0000000003e8001e00000000ffe200000000ffe200000000ffe20000fe0fffe2000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000008000000080000000400 +0000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000f80100 +000000000000000000e400cb0000000000000000010400f000000000000000000000000000e4 +00c80000000000e600be00cd000000dc00c20000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000404e54524d4c +4b4a49484746434241403f3e3d3c3b3a393837363534333231302f2e2d2c2b2a292827262524 +232221201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201002c01 +18b0184358456ab0194360b00c2344231020b00c4ef04d2fb000121b21231120332f592d2c01 +18b0184358b0052bb000134bb0145058b100403859b0062b1b21231120332f592d2c0118b018 +43584eb0032510f221b000124d1b2045b00425b00425234a6164b0285258212310d61bb00325 +10f221b0001259592d2cb01a435821211bb00225b0022549b00325b003254a612064b0105058 +2121211bb00325b0032549b0005058b0005058b8ffe238211bb0003821591bb0005258b01e38 +211bb0003821595959592d2c0118b0184358b0052bb000134bb0145058b90000ffc03859b006 +2b1b21231120332f592d2c4e018a10b10c194344b00014b1000ce2b00015b90000fff03800b0 +003cb0282bb0022510b0003c2d2c0118b0002fb00114f2b00113b001154db000122d2c0118b0 +184358b0052bb00013b90000ffe038b0062b1b21231120332f592d2c0118b018435845646a23 +456469b01943646060b00c2344231020b00cf02fb000121b2121208a208a525811331b212159 +592d2c014bb0c85158b10b0a432343650a592d2c004bb0c8515800b10a0b4323430b592d2c00 +b00c2370b1010c3e01b00c2370b1020c453ab10200080d2d2cb0122bb0022545b00225456ab0 +408b60b0022523442121212d2cb0132bb0022545b00225456ab8ffc08c60b002252344212121 +2d2cb000b0122b2121212d2cb000b0132b2121212d2c014bb0c85158b00643b00743650a592d +2c2069b04061b0008b20b12cc08a8cb8100062602b0c642364615c58b00361592d2cb1000325 +456854b01c4b505a58b0032545b0032545606820b004252344b0042523441bb0032520456820 +8a2344b00325456860b003252344592d2cb00325204568208a2344b003254564686560b00425 +b0016023442d2cb00943588721c01bb01243588745b0112bb00d2344b00d7ae41b038a451869 +20b00d23448a8a8720b0a05158b0112bb00d2344b00d7ae41b21b00d7ae4595959182d2c208a +4523456860442d2c456a422d2c01182f2d2c0118b0184358b00425b00425496423456469b040 +8b6120b080626ab00225b00225618cb0194360b00c2344218a10b00cf6211b21212121592d2c +01b0184358b0022545b002254564606ab00325456a6120b00425456a208a8b65b0042523448c +b00325234421211b20456a4420456a44592d2c012045b00055b018435a584568234569b0408b +6120b080626a208a236120b003258b65b0042523448cb00325234421211b2121b0192b592d2c +018a8a45642345646164422d2cb00425b00425b0192bb0184358b00425b00425b00325b01b2b +01b0022543b04054b0022543b000545a58b003252045b040614459b0022543b00054b0022543 +b040545a58b004252045b04060445959212121212d2cb0032520b0072587052e23208ab00425 +b00725b0142b1021c4212d2cc02d2c4b525845441b2121592d2cb00243583ded181bed592d2c +4b505845441b2121592d2c01184b52588a2fed1b212121592d2c4b53234b515a58b003254568 +b003254568b003256054582121211bb00225456860b0032523442121591b212121592d2cb002 +43583dcd181bcd592d2c462346608a8a462320468a608a61b8ff8062232010238ab10c0c8a70 +456020b0005058b00161b8ffba8b1bb0468c59b0106068013a2d2c2045b0032546524bb01351 +5b58b0022546206861b00325b003253f2321381b2111592d2c2045b00325465058b002254620 +6861b00325b003253f2321381b2111592d2c004bb0c8515800b00743b006430b592d2c8a10ec +2d2cb00c4358211b2046b0005258b8fff0381bb0103859592d2c20b0005558b8100063b00325 +4564b00325456461b0005358b0021bb04061b00359254569535845441b2121591b21b0022545 +b00225456164b028515845441b212159592d2c21210c6423648bb84000622d2c21b08051580c +6423648bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb81555621bb20080 +2f2b59b002602d2c0c6423648bb84000626023212d2c184b5358b00425b00425496423456469 +b0408b6120b080626ab00225b00225618cb00c2344218a10b00cf6211b218a11231220392f59 +2d2cb00225b002254964b0c05458b8fff838b008381b2121592d2cb0134358031b02592d2cb0 +134358021b03592d2cb00a2b2310203cb0172b2d2cb00225b8fff038b0282b8a102320d023b0 +102bb0054358c01b3c59201011b00012012d2cb0482b2d2c01b0022510d023c901b00113b000 +1410b0013cb001162d2c01b00013b001b0032549b0031738b001132d2c4b53234b515a582045 +8a60441b2121592d2c184b5358b00425b004254964b00325b00325496468b0408b6120b08062 +6ab00225b00225618cb00c234421b004251023b00cf61bb00425b0042511122320392f59cc21 +212d2c0118b0184358b0052546234564611b21b00425b004254a59b00e23442310b00eec2310 +b00eec2d2cb01b435820b0016045b000515820b0016020452068b0005558b0206044211b2121 +21591b20b0016020452068b0005558b8ffe06044b01c4b50582045b02060441b21591b212121 +59591b21592d2cb0022546206861b00325b003253f2321382d2c462346608a8a462320468a60 +8a61b8ff8062232010238ab10c0c8a70456020b0005058b00161b8ff808b1bb0818c59683a2d +2cb0402a212d2c2035b001602d2cb0024354584b53234b515a58381b2121591b21212121592d +2c49b00e23442d2cb0024354584b53234b515a5820458a60441b2121591b21212121592d2c4b +53234b515a5820458a60441b2121592d2c4b545820458a60441b2121592d2c4b53234b515a58 +381b2121592d2c4b5458381b2121592d2cb002435458b0462b1b21212121592d2cb002435458 +b0472b1b212121592d2cb002435458b0482b1b21212121592d2cb002435458b0492b1b212121 +592d2c4b52587d1b7a592d2cb1020042b123018851b1400188535a58b910000020885458b202 +010243604259b12401885158b920000040885458b2020202436042b12401885458b202200243 +6042004b014b5258b2020802436042591bb940000080885458b202040243604259b940000080 +63b80100885458b202080243604259b94000010063b80200885458b202100243604259b94000 +020063b80400885458b202400243604259595959592d0001000000050000da33a1ef5f0f3cf5 +001b080000000000bda4b81000000000c1473786fe80fc0a0b83094d00010009000100010000 +00000001000008b6fc0a002d0b6efe80fe350b83000100000000000000000000000000000004 +0400001f0436009205a80039077b004e00000000000000440000013c0000032c000005ac0001 +000000040132003c00fa000500020004001e005500000200031b0003000140fddfe016171cd4 +d516171c7b7c161b7b7c19d1d216171c767716171c6d7016171c6c6f16171c6b6e161b6b6e7f +721a747514151c676a14151c666914151c6568141b656885711a1973167a4319217943192191 +93012b9395022b9695012b817f022b7d7f022b7f85032b8885022b8785022b8485022b838502 +2b78850a0d391b37151836151535151234150f33150c3215093115063015032f15002e152627 +0e28270f2a2b0e2c2b0f22230e24230f1e1f0e201f0f0f10110c090a0b0c0607080c0304050c +0001020c1b011d0d18071a0d1510170d1204140d2c3c2a3c283c263c243c223c203c1e3c1b3c +183c153c123c0f3c093c063c033c003c50335401b0124b004b5442b013014b004b5342b0332b +4bb8032052b0322b4bb009505b58b101018e59b0332bb00288b8010054b00488b8020054b012 +435a5b58b80119b101018e851bb900010100b04b60858d592b2b1db0644b5358b0801d59b032 +4b5358b0901d59004bb03251b01b23422b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2bb1282645b02a4561b02c4560442b2b2b2b2b2b2b2b2b2b2b2b012b2b +2b2b2b2b2b2b002b2b2b2b2bb018b03f4b53422b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2bb10932 +2b4bb05052424bb008524bb008505bb01a23424bb0c8524bb036505bb00c234200> +] def +/f-1-0 currentdict end definefont pop +%%EndResource +%%BeginResource: font SegoeScript-Bold +11 dict begin +/FontType 42 def +/FontName /SegoeScript-Bold def +/PaintType 0 def +/FontMatrix [ 1 0 0 1 0 0 ] def +/FontBBox [ 0 0 0 0 ] def +/Encoding 256 array def +0 1 255 { Encoding exch /.notdef put } for +Encoding 1 /g1 put +Encoding 2 /g2 put +Encoding 3 /g3 put +Encoding 4 /g4 put +/CharStrings 5 dict dup begin +/.notdef 0 def +/g1 1 def +/g2 2 def +/g3 3 def +/g4 4 def +end readonly def +/sfnts [ +<00010000000900800003001063767420104621f400000528000001dc6670676d95c07f000000 +070400000950676c796660f622b60000009c0000048c68656164e82239ec0000105400000036 +6868656112e905b30000108c00000024686d747813da01d2000010b0000000146c6f63610000 +0c1c000010c4000000186d61787002a30568000010dc00000020707265703b264e1b000010fc +000001f00002001f000003e105fc00030007001b400c0004120305000701010900042fcd1239 +2fcd003fcd3fcd31303721112103112111e70232fdcec803c2b40493fab905fcfa04000100b9 +001e0436061d0049001d400d0a973b200125250f420000360f2fcd322f3312392f003f2fed31 +3001140e02070e0323222e0235343e04373e03373e0333321e0215140e02070e05070e031514 +1e0233323e02373637363633321e0204361d2f3b1d497f70652f2d5f4f32080c101212070610 +12110808212c351b222915060e151a0d02070a0b0a070107120f0a121c2311274d5869421a13 +13201a0714130d01a70a293234163752361b265c99722b6c767c756b2a244f4e471b1c413926 +101d28181b4a576131061f292d281d05217384873544552f11102844331315131706101d0000 +0002ffa9fe3e03f90461004c0068003b401c1b1b0e2f395a0e5a4825254d5048164d0000092f +8408086a1657833e2fed3311332fed33332fcd2f002fcd32332f1239cd2fcd3311392f313001 +140e0215060607030e03232226272e0335343e0233321e02171e0333323e02373e03370e0307 +0e0323222e0235343e02373e0333321e020734262322070e0315141633323e02373e03373e03 +03f90c0d0c0e12041c0743739d6170e4710924231b0f17190a11333a3c1b153f494e24344d36 +230a0408090b060d2b3132150d3646502632553d23244d7a551d5c6b702f21524831db0c0668 +9135563d21140c2052524816212a1d160d050a0a0a039d0714151508407a41fdfc7ec589475b +49061d252a130d120b051720230c0a18140d2b567e541f515e6936142b2a240d081f1f171f31 +3f202d7a93a6581e443b271b334822040494377d70540e1b1626363b15212c2b362b0f313635 +0000000200820020056d04810011004f003340174d0a39393e034d291c3e3e0329390a0a2121 +31000051501112392fcd332f331133002fcd332fcd113911123911332f313001342623220e04 +073636373e03051406070e0523222e0235343e0237363633321e0217161615140e0207060607 +1e0333323637363637363637363637373633321602651b110f282b2b2519051d2f1515353021 +03080c0e27758da1a5a44a5e8c5c2e15385f4a39843c0b2222200a202028455e362162380818 +2433232f6b362f5c2f1d5b2f204024353a24130a035c2c24243d515a5f2c182716153d424250 +0822173e929187683f34638f5b459a9fa14b3a3c0910160d29492e4874655e331f492b1f2d1e +0f201916432416532d1e3923342f1600000100cffff8046703fc004b0021400f3d471c15300f +030847350000353d262fcd32332f2f002fcdcd3f3f1239313001140623222e0223220e02070e +03070e03070e0323222e02272e0335343e02373e0333321e02151406070e03073e03373e0333 +321e02046734271b2b241f10122a2e3118112a2a260e0c1d191403060c15231e363617040403 +040302080b0d050a22292d1513271f140a080916130e01051a1d1c071d4c617a493851341903 +3c29351419141829361e153b40421c1942443e1527422f1a2e4856281a34394127337e745a0f +1b3125160a18271d071f1d1f525654210b3339350c316e5d3d21364505fa001e000005aa001e +00000546001e000000000000000000000000000003e8001e00000000ffe200000000ffe20000 +0000ffe20000fe0fffe200000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000800000008000000040000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000f80100000000000000000000e400cb00000000000000000104 +00f000000000000000000000000000e400c80000000000e600be00cd000000dc00c200000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000404e54524d4c4b4a49484746434241403f3e3d3c3b3a393837363534 +333231302f2e2d2c2b2a292827262524232221201f1e1d1c1b1a191817161514131211100f0e +0d0c0b0a090807060504030201002c0118b0184358456ab0194360b00c2344231020b00c4ef0 +4d2fb000121b21231120332f592d2c0118b0184358b0052bb000134bb0145058b100403859b0 +062b1b21231120332f592d2c0118b01843584eb0032510f221b000124d1b2045b00425b00425 +234a6164b0285258212310d61bb0032510f221b0001259592d2cb01a435821211bb00225b002 +2549b00325b003254a612064b01050582121211bb00325b0032549b0005058b0005058b8ffe2 +38211bb0003821591bb0005258b01e38211bb0003821595959592d2c0118b0184358b0052bb0 +00134bb0145058b90000ffc03859b0062b1b21231120332f592d2c4e018a10b10c194344b000 +14b1000ce2b00015b90000fff03800b0003cb0282bb0022510b0003c2d2c0118b0002fb00114 +f2b00113b001154db000122d2c0118b0184358b0052bb00013b90000ffe038b0062b1b212311 +20332f592d2c0118b018435845646a23456469b01943646060b00c2344231020b00cf02fb000 +121b2121208a208a525811331b212159592d2c014bb0c85158b10b0a432343650a592d2c004b +b0c8515800b10a0b4323430b592d2c00b00c2370b1010c3e01b00c2370b1020c453ab1020008 +0d2d2cb0122bb0022545b00225456ab0408b60b0022523442121212d2cb0132bb0022545b002 +25456ab8ffc08c60b0022523442121212d2cb000b0122b2121212d2cb000b0132b2121212d2c +014bb0c85158b00643b00743650a592d2c2069b04061b0008b20b12cc08a8cb8100062602b0c +642364615c58b00361592d2cb1000325456854b01c4b505a58b0032545b0032545606820b004 +252344b0042523441bb00325204568208a2344b00325456860b003252344592d2cb003252045 +68208a2344b003254564686560b00425b0016023442d2cb00943588721c01bb01243588745b0 +112bb00d2344b00d7ae41b038a45186920b00d23448a8a8720b0a05158b0112bb00d2344b00d +7ae41b21b00d7ae4595959182d2c208a4523456860442d2c456a422d2c01182f2d2c0118b018 +4358b00425b00425496423456469b0408b6120b080626ab00225b00225618cb0194360b00c23 +44218a10b00cf6211b21212121592d2c01b0184358b0022545b002254564606ab00325456a61 +20b00425456a208a8b65b0042523448cb00325234421211b20456a4420456a44592d2c012045 +b00055b018435a584568234569b0408b6120b080626a208a236120b003258b65b0042523448c +b00325234421211b2121b0192b592d2c018a8a45642345646164422d2cb00425b00425b0192b +b0184358b00425b00425b00325b01b2b01b0022543b04054b0022543b000545a58b003252045 +b040614459b0022543b00054b0022543b040545a58b004252045b04060445959212121212d2c +b0032520b0072587052e23208ab00425b00725b0142b1021c4212d2cc02d2c4b525845441b21 +21592d2cb00243583ded181bed592d2c4b505845441b2121592d2c01184b52588a2fed1b2121 +21592d2c4b53234b515a58b003254568b003254568b003256054582121211bb00225456860b0 +032523442121591b212121592d2cb00243583dcd181bcd592d2c462346608a8a462320468a60 +8a61b8ff8062232010238ab10c0c8a70456020b0005058b00161b8ffba8b1bb0468c59b01060 +68013a2d2c2045b0032546524bb013515b58b0022546206861b00325b003253f2321381b2111 +592d2c2045b00325465058b0022546206861b00325b003253f2321381b2111592d2c004bb0c8 +515800b00743b006430b592d2c8a10ec2d2cb00c4358211b2046b0005258b8fff0381bb01038 +59592d2c20b0005558b8100063b003254564b00325456461b0005358b0021bb04061b0035925 +4569535845441b2121591b21b0022545b00225456164b028515845441b212159592d2c21210c +6423648bb84000622d2c21b08051580c6423648bb82000621bb200402f2b59b002602d2c21b0 +c051580c6423648bb81555621bb200802f2b59b002602d2c0c6423648bb84000626023212d2c +184b5358b00425b00425496423456469b0408b6120b080626ab00225b00225618cb00c234421 +8a10b00cf6211b218a11231220392f592d2cb00225b002254964b0c05458b8fff838b008381b +2121592d2cb0134358031b02592d2cb0134358021b03592d2cb00a2b2310203cb0172b2d2cb0 +0225b8fff038b0282b8a102320d023b0102bb0054358c01b3c59201011b00012012d2cb0482b +2d2c01b0022510d023c901b00113b0001410b0013cb001162d2c01b00013b001b0032549b003 +1738b001132d2c4b53234b515a5820458a60441b2121592d2c184b5358b00425b004254964b0 +0325b00325496468b0408b6120b080626ab00225b00225618cb00c234421b004251023b00cf6 +1bb00425b0042511122320392f59cc21212d2c0118b0184358b0052546234564611b21b00425 +b004254a59b00e23442310b00eec2310b00eec2d2cb01b435820b0016045b000515820b00160 +20452068b0005558b0206044211b212121591b20b0016020452068b0005558b8ffe06044b01c +4b50582045b02060441b21591b21212159591b21592d2cb0022546206861b00325b003253f23 +21382d2c462346608a8a462320468a608a61b8ff8062232010238ab10c0c8a70456020b00050 +58b00161b8ff808b1bb0818c59683a2d2cb0402a212d2c2035b001602d2cb0024354584b5323 +4b515a58381b2121591b21212121592d2c49b00e23442d2cb0024354584b53234b515a582045 +8a60441b2121591b21212121592d2c4b53234b515a5820458a60441b2121592d2c4b54582045 +8a60441b2121592d2c4b53234b515a58381b2121592d2c4b5458381b2121592d2cb002435458 +b0462b1b21212121592d2cb002435458b0472b1b212121592d2cb002435458b0482b1b212121 +21592d2cb002435458b0492b1b212121592d2c4b52587d1b7a592d2cb1020042b123018851b1 +400188535a58b910000020885458b202010243604259b12401885158b920000040885458b202 +0202436042b12401885458b2022002436042004b014b5258b2020802436042591bb940000080 +885458b202040243604259b94000008063b80100885458b202080243604259b94000010063b8 +0200885458b202100243604259b94000020063b80400885458b202400243604259595959592d +0001000000050000557a91035f0f3cf5001b080000000000bda4b81000000000c1473786fe80 +fc0a0b83094d0001000900010001000000000001000008b6fc0a002d0b6efe80fe350b830001 +000000000000000000000000000000050400001f032800b9042dffa9042a0082045a00cf0000 +0000000000440000012c000002840000039c0000048c0001000000050132003c00fa00050002 +0004001e005500000200031b0003000140fddfe016171cd4d516171c7b7c161b7b7c19d1d216 +171c767716171c6d7016171c6c6f16171c6b6e161b6b6e7f721a747514151c676a14151c6669 +14151c6568141b656885711a1973167a431921794319219193012b9395022b9695012b817f02 +2b7d7f022b7f85032b8885022b8785022b8485022b8385022b78850a0d391b37151836151535 +151234150f33150c3215093115063015032f15002e1526270e28270f2a2b0e2c2b0f22230e24 +230f1e1f0e201f0f0f10110c090a0b0c0607080c0304050c0001020c1b011d0d18071a0d1510 +170d1204140d2c3c2a3c283c263c243c223c203c1e3c1b3c183c153c123c0f3c093c063c033c +003c50335401b0124b004b5442b013014b004b5342b0332b4bb8032052b0322b4bb009505b58 +b101018e59b0332bb00288b8010054b00488b8020054b012435a5b58b80119b101018e851bb9 +00010100b04b60858d592b2b1db0644b5358b0801d59b0324b5358b0901d59004bb03251b01b +23422b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2bb1282645 +b02a4561b02c4560442b2b2b2b2b2b2b2b2b2b2b2b012b2b2b2b2b2b2b2b002b2b2b2b2bb018 +b03f4b53422b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2bb109322b4bb05052424bb008524bb00850 +5bb01a23424bb0c8524bb036505bb00c234200> +] def +/f-1-1 currentdict end definefont pop +%%EndResource +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 0 304 177 +%%EndPageSetup +q 0 0 304 177 rectclip +1 0 0 -1 0 177 cm q +0 0.243137 0.631373 rg +BT +143.999998 0 0 -143.999998 -4.031982 103.968015 Tm +/f-0-0 1 Tf +(SQL)Tj +71.999999 0 0 -71.999999 30.402878 160.500004 Tm +/f-1-1 1 Tf +<01>Tj +/f-1-0 1 Tf +(ed)Tj +/f-1-1 1 Tf +<020304>Tj +46.799995 0 0 -46.799995 261.836476 131.700005 Tm +/f-1-0 1 Tf +(\256)Tj +ET +Q Q +showpage %%Trailer +end %%EOF diff --git a/images/sql-ledger.gif b/images/sql-ledger.gif index e34aee1d7842c2e81378d56763cc8e7da69bf345..400ace60e7850e5179362e19d3463d3fdd6959fc 100644 GIT binary patch literal 3818 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 literal 3825 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 diff --git a/images/up.png b/images/up.png index 0d7813ecad84ca997e93e4689755fb30fac60450..fea0f35789aa97c4e47b57c11cd87247b17c489c 100644 GIT binary patch literal 591 zcmV-V0r?~kSbdur^>?>6q!h3OZ&_O}_W^f89UGhFINqDItwq1ST zhI{ULK6eLq!apL4qT?d+47e6T_%f~5Oj~R;8Yhe~??mK`h-^ktbaG#qbFMZR3=-fN z@EIr@V_rMwYJ0-G_wypM0aR4AU9DDYs@euBBC_GVpP$qxI}`PK{ZyXkuYft=Nt&iN z0R_Z+{|LAN{4~a#>vTFFi@h^DPUKW|1U*dC^wtmpAj`7#N~Ll@M9!;f%UYXcS@z>E zEQ+F7L|y_%RrNs#VP(=)vMhUJtu??BaHU)>zwPyU-^W-S$ESzT5nwfhaAy)!026EN zHgHKqTGrYRS(bej=iH)*JO>T|chfYzHw`LA9LFoFx(fWx^L%;6TKgDS0B)ygdVjYN zz}D8*du#14;G&2emS(egu;1@r2qCPEiiWR#3HTI3*c|1ZbBjPtRbO8`~m;~ literal 709 zcmV;$0y_PPP)C(0ldpd>)?n;YcQ# zWN_fX!HHj(Bbh=;iOa~sX-?$)9FGMo!HafSVSyj3@I#3JC_&4#Ov_}WVH%P0Z007Ee<>rcn9YH%2qbL0tVvDNCqjIgt6XP03y~9nT!iIV}obqR%rkRa~MS&wK3Q7feX% z(e>t9$Jz(1qs6ZSr#ETPU6iIZmRw;k;huMU7T`3`zH-*FNxHO~!MEO6D%kd)hJ$=NO$nHB~l!P3#xj!~s62GpKz_Q^=CqtJbi(pZjORoExm(o)fm`BT>Wo zjyT^zpJQbsqhVjeO<~`JI3Zn#<6(pWMjEB}@>Pb9Hy(YL*{D3WzP3w9K=R>r!3k&L r_a?Xgn_7e0(87f|%yDcC{_Fk%pc_*@#icmk00000NkvXXu0mjf9x_Lf From 58ac148d9d1aa202881deda4814369cf2b344503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsirafovics=20=28Gy=C3=B6rgy=20T=C3=B3th-Szab=C3=B3=29?= Date: Tue, 20 Jan 2026 15:02:21 +0100 Subject: [PATCH 2/3] menu.ini restructure, add Documents link --- menu.ini | 1661 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 857 insertions(+), 804 deletions(-) diff --git a/menu.ini b/menu.ini index 835e95da6..d352dc2f3 100644 --- a/menu.ini +++ b/menu.ini @@ -1,1351 +1,1319 @@ -[
] +[Quotations] + +[Quotations--Quotation] +module=oe.pl +action=add +type=sales_quotation + +[Quotations--RFQ] +module=oe.pl +action=add +type=request_quotation + +[Quotations--Reports] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 + +[Quotations--Reports--Quotations] +module=oe.pl +action=search +type=sales_quotation + +[Quotations--Reports--RFQs] +module=oe.pl +action=search +type=request_quotation + +[Order Entry] + +[Order Entry--Sales Order] +module=oe.pl +action=add +type=sales_order + +[Order Entry--Purchase Order] +module=oe.pl +action=add +type=purchase_order + +[Order Entry--Reports] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 + +[Order Entry--Reports--Sales Orders] +module=oe.pl +action=search +type=sales_order + +[Order Entry--Reports--Requirements] +module=ic.pl +action=so_requirements + +[Order Entry--Reports--Purchase Orders] +module=oe.pl +action=search +type=purchase_order + +[Order Entry--Generate] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 + +[Order Entry--Generate--Purchase Orders] +module=oe.pl +action=search +type=generate_purchase_order + +[Order Entry--Generate--Sales Invoices] +module=oe.pl +action=search +type=generate_sales_invoices + +[Order Entry--Consolidate] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 + +[Order Entry--Consolidate--Sales Orders] +module=oe.pl +action=search +type=consolidate_sales_order + +[Order Entry--Consolidate--Purchase Orders] +module=oe.pl +action=search +type=consolidate_purchase_order + +[Order Entry--Consolidate--Sales Orders to Invoice] +module=oe.pl +action=search +type=consolidate_sales_order_invoice + +[Projects] + +[Projects--Add Project] +module=pe.pl +action=add +type=project + +[Projects--Add Time Card] +module=jc.pl +action=add +type=timecard +project=project + +[Projects--Reports] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 + +[Projects--Reports--Projects] +module=pe.pl +action=search +type=project + +[Projects--Reports--Transactions] +module=rp.pl +action=report +reportcode=projects + +[Projects--Reports--Time Cards] +module=jc.pl +action=search +type=timecard +project=project + +[Projects--Generate] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 + +[Projects--Generate--Sales Orders] +module=pe.pl +action=project_sales_order + +[Projects--Translations] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 + +[Projects--Translations--Description] +module=pe.pl +action=translation +translation=project + +[Jobs] + +[Jobs--Add Job] +module=pe.pl +action=add +type=job + +[Jobs--Add Time Card] +module=jc.pl +action=add +type=timecard +project=job + +[Jobs--Add Stores Card] +module=jc.pl +action=add +type=storescard +project=job + +[Jobs--Stock Finished Goods] +module=pe.pl +action=search +type=stock + +[Jobs--Reports] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 + +[Jobs--Reports--Jobs] +module=pe.pl +action=search +type=job + +[Jobs--Reports--Time Cards] +module=jc.pl +action=search +type=timecard +project=job + +[Jobs--Reports--Stores Cards] +module=jc.pl +action=search +type=storescard +project=job + +[Jobs--Reports--Time & Stores Cards] +module=jc.pl +action=search +project=job + +[Logistics] + +[Logistics--Merchandise] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 + +[Logistics--Merchandise--Ship] +module=oe.pl +action=search +type=ship_order + +[Logistics--Merchandise--Receive] +module=oe.pl +action=search +type=receive_order + +[Logistics--Merchandise--Assembly BOM Transfer] +module=ic.pl +action=assembly_bom_transfer + +[Logistics--Merchandise--Warehouse Transfer] +module=ic.pl +action=search_transfer +nextsub=transfer_list + +[Logistics--Reports] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 -[AR] +[Logistics--Reports--Warehouse Transfer] +module=ic.pl +action=search_transfer +nextsub=transfer_report + +[Finance] + +[Finance--AR] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 -[AR--Add Transaction] +[Finance--AR--Add Transaction] module=ar.pl action=add type=transaction -[AR--Sales Invoice] +[Finance--AR--Sales Invoice] module=is.pl action=add type=invoice -[AR--Credit Note] +[Finance--AR--Credit Note] module=ar.pl action=add type=credit_note -[AR--Credit Invoice] +[Finance--AR--Credit Invoice] module=is.pl action=add type=credit_invoice -[AR--Reports] +[Finance--AR--Reports] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[AR--Reports--Transactions] +[Finance--AR--Reports--Transactions] module=ar.pl action=search nextsub=transactions -[AR--Reports--Outstanding] +[Finance--AR--Reports--Outstanding] module=ar.pl action=search outstanding=1 nextsub=transactions -[AR--Reports--AR Aging] +[Finance--AR--Reports--AR Aging] module=rp.pl action=report reportcode=ar_aging -[AR--Reports--Reminder] +[Finance--AR--Reports--Reminder] module=rp.pl action=report reportcode=reminder -[AR--Reports--Tax collected] +[Finance--AR--Reports--Tax collected] module=rp.pl action=report reportcode=tax_collected -[AR--Reports--Non-taxable] +[Finance--AR--Reports--Non-taxable] module=rp.pl action=report reportcode=nontaxable_sales -[AR--Generate] +[Finance--AR--Generate] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[AR--Generate--Sales Invoices] +[Finance--AR--Generate--Sales Invoices] module=is.pl action=generate type=invoice -[AR--Consolidate] +[Finance--AR--Consolidate] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[AR--Consolidate--Sales Invoices] +[Finance--AR--Consolidate--Sales Invoices] module=is.pl type=invoice action=consolidate -[POS] - -[POS--Sale] -module=ps.pl -action=add -nextsub=openinvoices - -[POS--Open] -module=ps.pl -action=openinvoices - -[POS--Receipts] -module=ps.pl -action=receipts - -[Customers] - -[Customers--Add Customer] -module=ct.pl -action=add -db=customer - -[Customers--Reports] +[Finance--AP] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Customers--Reports--Search] -module=ct.pl -action=search -db=customer - -[Customers--Reports--History] -module=ct.pl -action=history -db=customer - -[AP] - -[AP--Add Transaction] +[Finance--AP--Add Transaction] module=ap.pl action=add type=transaction -[AP--Vendor Invoice] +[Finance--AP--Vendor Invoice] module=ir.pl action=add type=invoice -[AP--Debit Note] +[Finance--AP--Debit Note] module=ap.pl action=add type=debit_note -[AP--Debit Invoice] +[Finance--AP--Debit Invoice] module=ir.pl action=add type=debit_invoice -[AP--Reports] +[Finance--AP--Reports] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[AP--Reports--Transactions] +[Finance--AP--Reports--Transactions] module=ap.pl action=search nextsub=transactions -[AP--Reports--Outstanding] +[Finance--AP--Reports--Outstanding] module=ap.pl action=search outstanding=1 nextsub=transactions -[AP--Reports--AP Aging] +[Finance--AP--Reports--AP Aging] module=rp.pl action=report reportcode=ap_aging -[AP--Reports--Tax paid] +[Finance--AP--Reports--Tax paid] module=rp.pl action=report reportcode=tax_paid -[AP--Reports--Non-taxable] +[Finance--AP--Reports--Non-taxable] module=rp.pl action=report reportcode=nontaxable_purchases -[Vendors] - -[Vendors--Add Vendor] -module=ct.pl -action=add -db=vendor - -[Vendors--Reports] +[Finance--POS] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Vendors--Reports--Search] -module=ct.pl -action=search -db=vendor +[Finance--POS--Sale] +module=ps.pl +action=add +nextsub=openinvoices -[Vendors--Reports--History] -module=ct.pl -action=history -db=vendor +[Finance--POS--Open] +module=ps.pl +action=openinvoices + +[Finance--POS--Receipts] +module=ps.pl +action=receipts -[Cash] +[Finance--Cash] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 -[Cash--Receipt] +[Finance--Cash--Receipt] module=cp.pl action=payment type=receipt -[Cash--Receipts] +[Finance--Cash--Receipts] module=cp.pl action=payments type=receipt -[Cash--Payment] +[Finance--Cash--Payment] module=cp.pl action=payment type=check -[Cash--Payments] +[Finance--Cash--Payments] module=cp.pl action=payments type=check -[Cash--Void Check] +[Finance--Cash--Void Check] module=cp.pl action=payment_register type=check ARAP=AP void=1 -[Cash--Reissue Check] +[Finance--Cash--Reissue Check] module=cp.pl action=payment_register type=check ARAP=AP reissue=1 -[Cash--Void Receipt] +[Finance--Cash--Void Receipt] module=cp.pl action=payment_register type=receipt ARAP=AR void=1 -[Cash--Reissue Receipt] +[Finance--Cash--Reissue Receipt] module=cp.pl action=payment_register type=receipt ARAP=AR reissue=1 -[Cash--Reports] +[Finance--Cash--FX Adjustment] +module=gl.pl +action=add +fxadj=1 + +[Finance--Cash--Reconciliation] +module=rc.pl +action=reconciliation + +[Finance--Cash--Reports] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Cash--Reports--Receipts] +[Finance--Cash--Reports--Receipts] module=rp.pl action=report reportcode=receipts -[Cash--Reports--Payments] +[Finance--Cash--Reports--Payments] module=rp.pl action=report reportcode=payments -[Vouchers] +[Finance--Cash--Reports--Reconciliation] +module=rc.pl +action=reconciliation +report=1 + +[Finance--Vouchers] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 -[Vouchers--Payable] +[Finance--Vouchers--Payable] module=vr.pl action=payable_batch -[Vouchers--Payment] +[Finance--Vouchers--Payment] module=vr.pl action=payment_batch -[Vouchers--Payments] +[Finance--Vouchers--Payments] module=vr.pl action=payments_batch -[Vouchers--Payment Reversal] +[Finance--Vouchers--Payment Reversal] module=vr.pl action=payment_reversal_batch -[Vouchers--General Ledger] +[Finance--Vouchers--General Ledger] module=vr.pl action=general_ledger_batch -[Vouchers--Reports] +[Finance--Vouchers--Reports] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Vouchers--Reports--All Batches] +[Finance--Vouchers--Reports--All Batches] module=vr.pl action=search -[Vouchers--Reports--Payable] +[Finance--Vouchers--Reports--Payable] module=vr.pl action=search batch=ap -[Vouchers--Reports--Payment] +[Finance--Vouchers--Reports--Payment] module=vr.pl action=search batch=payment -[Vouchers--Reports--Payment Reversal] +[Finance--Vouchers--Reports--Payment Reversal] module=vr.pl action=search batch=payment_reversal -[Vouchers--Reports--General Ledger] +[Finance--Vouchers--Reports--General Ledger] module=vr.pl action=search batch=gl -[HR] - -[HR--Employees] -module=menu.pl -action=acc_menu -target=acc_menu -submenu=1 +[Finance--Exchange Rates] +module=am.pl +action=search_exchangerates -[HR--Employees--Add Employee] -module=hr.pl -action=add -db=employee +[Finance--Recurring Transactions] +module=am.pl +action=recurring_transactions -[HR--Employees--Reports] -module=hr.pl -action=search -db=employee +[Bookkeeping] -[HR--Payroll] +[Bookkeeping--General Ledger] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[HR--Payroll--Add Transaction] -module=hr.pl +[Bookkeeping--General Ledger--Add Transaction] +module=gl.pl action=add -db=payroll - -[HR--Payroll--Transactions] -module=hr.pl -action=search -db=payroll - -[HR--Payroll--Setup] -module=menu.pl -action=acc_menu -target=acc_menu -submenu=1 - -[HR--Payroll--Setup--Wages] -module=hr.pl -action=search -db=wage -[HR--Payroll--Setup--Deductions] -module=hr.pl +[Bookkeeping--General Ledger--Reports] +module=gl.pl action=search -db=deduction - -[Order Entry] - -[Order Entry--Sales Order] -module=oe.pl -action=add -type=sales_order - -[Order Entry--Purchase Order] -module=oe.pl -action=add -type=purchase_order -[Order Entry--Reports] +[Bookkeeping--General Ledger--Chart of Accounts] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Order Entry--Reports--Sales Orders] -module=oe.pl -action=search -type=sales_order - -[Order Entry--Reports--Requirements] -module=ic.pl -action=so_requirements +[Bookkeeping--General Ledger--Chart of Accounts--Add Account] +module=am.pl +action=add_account -[Order Entry--Reports--Purchase Orders] -module=oe.pl -action=search -type=purchase_order +[Bookkeeping--General Ledger--Chart of Accounts--List Accounts] +module=am.pl +action=list_account -[Order Entry--Generate] -module=menu.pl -action=acc_menu -target=acc_menu -submenu=1 +[Bookkeeping--General Ledger--Chart of Accounts--Translations] +module=pe.pl +action=translation +translation=chart -[Order Entry--Generate--Purchase Orders] -module=oe.pl -action=search -type=generate_purchase_order +[Bookkeeping--General Ledger--Chart of Accounts--Add GIFI] +module=am.pl +action=add_gifi -[Order Entry--Generate--Sales Invoices] -module=oe.pl -action=search -type=generate_sales_invoices +[Bookkeeping--General Ledger--Chart of Accounts--List GIFI] +module=am.pl +action=list_gifi -[Order Entry--Consolidate] +[Bookkeeping--Financial Reports] module=menu.pl action=acc_menu target=acc_menu submenu=1 - -[Order Entry--Consolidate--Sales Orders] -module=oe.pl -action=search -type=consolidate_sales_order - -[Order Entry--Consolidate--Purchase Orders] -module=oe.pl -action=search -type=consolidate_purchase_order - -[Order Entry--Consolidate--Sales Orders to Invoice] -module=oe.pl -action=search -type=consolidate_sales_order_invoice - -[Logistics] -[Logistics--Merchandise] -module=menu.pl -action=acc_menu -target=acc_menu -submenu=1 +[Bookkeeping--Financial Reports--Chart of Accounts] +module=ca.pl +action=chart_of_accounts -[Logistics--Merchandise--Ship] -module=oe.pl -action=search -type=ship_order +[Bookkeeping--Financial Reports--Trial Balance] +module=rp.pl +action=report +reportcode=trial_balance -[Logistics--Merchandise--Receive] -module=oe.pl -action=search -type=receive_order +[Bookkeeping--Financial Reports--Income Statement] +module=rp.pl +action=report +reportcode=income_statement -[Logistics--Merchandise--Assembly BOM Transfer] -module=ic.pl -action=assembly_bom_transfer +[Bookkeeping--Financial Reports--Balance Sheet] +module=rp.pl +action=report +reportcode=balance_sheet -[Logistics--Merchandise--Warehouse Transfer] -module=ic.pl -action=search_transfer -nextsub=transfer_list +[Bookkeeping--Bank Accounts] +module=am.pl +action=bank_accounts -[Logistics--Reports] -module=menu.pl -action=acc_menu -target=acc_menu -submenu=1 +[Bookkeeping--Taxes] +module=am.pl +action=taxes -[Logistics--Reports--Warehouse Transfer] -module=ic.pl -action=search_transfer -nextsub=transfer_report +[Bookkeeping--Currencies] +module=am.pl +action=list_currencies -[Quotations] +[Bookkeeping--Payment Methods] +module=am.pl +action=list_paymentmethod -[Quotations--Quotation] -module=oe.pl -action=add -type=sales_quotation +[Bookkeeping--Yearend] +module=am.pl +action=yearend -[Quotations--RFQ] -module=oe.pl -action=add -type=request_quotation +[Master Records] -[Quotations--Reports] +[Master Records--Goods & Services] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Quotations--Reports--Quotations] -module=oe.pl -action=search -type=sales_quotation - -[Quotations--Reports--RFQs] -module=oe.pl -action=search -type=request_quotation - -[General Ledger] - -[General Ledger--Add Transaction] -module=gl.pl -action=add - -[General Ledger--FX Adjustment] -module=gl.pl -action=add -fxadj=1 - -[General Ledger--Reconciliation] -module=rc.pl -action=reconciliation - -[General Ledger--Reports] -module=gl.pl -action=search - -[Goods & Services] - -[Goods & Services--Add Part] +[Master Records--Goods & Services--Add Part] module=ic.pl action=add item=part -[Goods & Services--Add Service] +[Master Records--Goods & Services--Add Service] module=ic.pl action=add item=service -[Goods & Services--Add Kit] +[Master Records--Goods & Services--Add Kit] module=ic.pl action=add item=kit -[Goods & Services--Add Assembly] +[Master Records--Goods & Services--Add Assembly] module=ic.pl action=add item=assembly -[Goods & Services--Add Labor/Overhead] +[Master Records--Goods & Services--Add Labor/Overhead] module=ic.pl action=add item=labor -[Goods & Services--Add Group] +[Master Records--Goods & Services--Add Group] module=pe.pl action=add type=partsgroup -[Goods & Services--Add Pricegroup] +[Master Records--Goods & Services--Add Pricegroup] module=pe.pl action=add type=pricegroup -[Goods & Services--Stock Assembly] +[Master Records--Goods & Services--Stock Assembly] module=ic.pl action=stock_assembly -[Goods & Services--Stock Adjustment] +[Master Records--Goods & Services--Stock Adjustment] module=ic.pl action=stock_adjustment -[Goods & Services--Reports] +[Master Records--Goods & Services--Reports] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Goods & Services--Reports--All Items] +[Master Records--Goods & Services--Reports--All Items] module=ic.pl action=search searchitems=all -[Goods & Services--Reports--Parts] +[Master Records--Goods & Services--Reports--Parts] module=ic.pl action=search searchitems=part -[Goods & Services--Reports--Services] +[Master Records--Goods & Services--Reports--Services] module=ic.pl action=search searchitems=service -[Goods & Services--Reports--Labor/Overhead] +[Master Records--Goods & Services--Reports--Labor/Overhead] module=ic.pl action=search searchitems=labor -[Goods & Services--Reports--Groups] +[Master Records--Goods & Services--Reports--Groups] module=pe.pl action=search type=partsgroup -[Goods & Services--Reports--Pricegroups] +[Master Records--Goods & Services--Reports--Pricegroups] module=pe.pl action=search type=pricegroup -[Goods & Services--Reports--Kits] +[Master Records--Goods & Services--Reports--Kits] module=ic.pl action=search searchitems=kit -[Goods & Services--Reports--Assemblies] +[Master Records--Goods & Services--Reports--Assemblies] module=ic.pl action=search searchitems=assembly -[Goods & Services--Reports--Components] +[Master Records--Goods & Services--Reports--Components] module=ic.pl action=search searchitems=component -[Goods & Services--Reports--Supply / Demand] +[Master Records--Goods & Services--Reports--Supply / Demand] module=ic.pl action=supply_demand -[Goods & Services--Reports--Requirements] +[Master Records--Goods & Services--Reports--Requirements] module=ic.pl action=requirements -[Goods & Services--Changeup] +[Master Records--Goods & Services--Changeup] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Goods & Services--Changeup--Parts] +[Master Records--Goods & Services--Changeup--Parts] module=ic.pl action=search searchitems=part changeup=1 -[Goods & Services--Changeup--Services] +[Master Records--Goods & Services--Changeup--Services] module=ic.pl action=search searchitems=service changeup=1 -[Goods & Services--Changeup--Assemblies] +[Master Records--Goods & Services--Changeup--Assemblies] module=ic.pl action=search searchitems=assembly changeup=1 -[Goods & Services--Changeup--Kits] +[Master Records--Goods & Services--Changeup--Kits] module=ic.pl action=search searchitems=kit changeup=1 -[Goods & Services--Changeup--Labor/Overhead] +[Master Records--Goods & Services--Changeup--Labor/Overhead] module=ic.pl action=search searchitems=labor changeup=1 -[Goods & Services--Translations] +[Master Records--Goods & Services--Translations] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Goods & Services--Translations--Description] +[Master Records--Goods & Services--Translations--Description] module=pe.pl action=translation translation=description -[Goods & Services--Translations--Groups] +[Master Records--Goods & Services--Translations--Groups] module=pe.pl action=translation translation=partsgroup -[Projects & Jobs] +[Master Records--Customers] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Projects & Jobs--Projects] +[Master Records--Customers--Add Customer] +module=ct.pl +action=add +db=customer + +[Master Records--Customers--Reports] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Projects & Jobs--Projects--Add Project] -module=pe.pl -action=add -type=project +[Master Records--Customers--Reports--Search] +module=ct.pl +action=search +db=customer -[Projects & Jobs--Projects--Add Time Card] -module=jc.pl -action=add -type=timecard -project=project +[Master Records--Customers--Reports--History] +module=ct.pl +action=history +db=customer -[Projects & Jobs--Projects--Reports] +[Master Records--Vendors] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Projects & Jobs--Projects--Reports--Projects] -module=pe.pl -action=search -type=project - -[Projects & Jobs--Projects--Reports--Transactions] -module=rp.pl -action=report -reportcode=projects - -[Projects & Jobs--Projects--Reports--Time Cards] -module=jc.pl -action=search -type=timecard -project=project +[Master Records--Vendors--Add Vendor] +module=ct.pl +action=add +db=vendor -[Projects & Jobs--Projects--Generate] +[Master Records--Vendors--Reports] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Projects & Jobs--Projects--Generate--Sales Orders] -module=pe.pl -action=project_sales_order +[Master Records--Vendors--Reports--Search] +module=ct.pl +action=search +db=vendor + +[Master Records--Vendors--Reports--History] +module=ct.pl +action=history +db=vendor -[Projects & Jobs--Projects--Translations] +[Master Records--HR] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Projects & Jobs--Jobs] +[Master Records--HR--Employees] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Projects & Jobs--Jobs--Add Job] -module=pe.pl +[Master Records--HR--Employees--Add Employee] +module=hr.pl action=add -type=job - -[Projects & Jobs--Jobs--Add Time Card] -module=jc.pl -action=add -type=timecard -project=job - -[Projects & Jobs--Jobs--Add Stores Card] -module=jc.pl -action=add -type=storescard -project=job +db=employee -[Projects & Jobs--Jobs--Stock Finished Goods] -module=pe.pl +[Master Records--HR--Employees--Reports] +module=hr.pl action=search -type=stock +db=employee -[Projects & Jobs--Jobs--Reports] +[Master Records--HR--Payroll] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Projects & Jobs--Jobs--Reports--Jobs] -module=pe.pl -action=search -type=job - -[Projects & Jobs--Jobs--Reports--Time Cards] -module=jc.pl -action=search -type=timecard -project=job - -[Projects & Jobs--Jobs--Reports--Stores Cards] -module=jc.pl -action=search -type=storescard -project=job +[Master Records--HR--Payroll--Add Transaction] +module=hr.pl +action=add +db=payroll -[Projects & Jobs--Jobs--Reports--Time & Stores Cards] -module=jc.pl +[Master Records--HR--Payroll--Transactions] +module=hr.pl action=search -project=job +db=payroll -[Projects & Jobs--Translations] +[Master Records--HR--Payroll--Setup] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Projects & Jobs--Translations--Description] -module=pe.pl -action=translation -translation=project +[Master Records--HR--Payroll--Setup--Wages] +module=hr.pl +action=search +db=wage -[Reference Documents] +[Master Records--HR--Payroll--Setup--Deductions] +module=hr.pl +action=search +db=deduction -[Reference Documents--Add Document] -module=rd.pl -action=add_document +[System] -[Reference Documents--List Documents] -module=rd.pl -action=search_documents +[System--Preferences] +module=am.pl +action=config -[Image Files] +[System--Recently Used] +module=ru.pl +action=list_recent -[Image Files--Add File] -module=rd.pl -action=upload_image +[System--Defaults] +module=am.pl +action=defaults -[Image Files--List Files] -module=rd.pl -action=list_images +[System--Audit Control] +module=am.pl +action=audit_control -[Reports] +[System--Audit Log] +module=am.pl +action=audit_log -[Reports--Chart of Accounts] -module=ca.pl -action=chart_of_accounts +[System--Workstations] +module=am.pl +action=workstations -[Reports--Reconciliation] -module=rc.pl -action=reconciliation -report=1 +[System--Roles] +module=am.pl +action=list_roles -[Reports--Trial Balance] -module=rp.pl -action=report -reportcode=trial_balance +[System--Warehouses] +module=am.pl +action=list_warehouse -[Reports--Income Statement] -module=rp.pl -action=report -reportcode=income_statement +[System--Departments] +module=am.pl +action=list_department -[Reports--Balance Sheet] -module=rp.pl -action=report -reportcode=balance_sheet +[System--Type of Business] +module=am.pl +action=list_business -[Recurring Transactions] +[System--Language] module=am.pl -action=recurring_transactions +action=list_language -[Batch] +[System--Mimetypes] +module=am.pl +action=list_mimetypes + +[System--SIC] +module=am.pl +action=list_sic + +[System--Stylesheet] +module=am.pl +action=display_stylesheet + +[System--Version] +module=am.pl +action=company_logo -[Batch--Print] +[System--Maintenance] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Batch--Print--Sales Invoices] -module=bp.pl -action=search -type=invoice -vc=customer -batch=print - -[Batch--Print--Remittance Vouchers] -module=bp.pl -action=search -type=remittance_voucher -vc=customer -batch=print - -[Batch--Print--Sales Orders] -module=bp.pl -action=search -type=sales_order -batch=print - -[Batch--Print--Work Orders] -module=bp.pl -action=search -type=work_order -batch=print - -[Batch--Print--Quotations] -module=bp.pl -action=search -type=sales_quotation -batch=print - -[Batch--Print--Packing Lists] -module=bp.pl -action=search -type=packing_list -batch=print - -[Batch--Print--Pick Lists] -module=bp.pl -action=search -type=pick_list -batch=print +[System--Maintenance--Repost Invoices] +module=sm.pl +action=repost_invoices -[Batch--Print--Vendor Invoices] -module=bp.pl -action=search -type=invoice -vc=vendor -batch=print +[System--Maintenance--Mapfile] +module=am.pl +action=list_templates +file=templates=/import.map -[Batch--Print--Purchase Orders] -module=bp.pl -action=search -type=purchase_order -batch=print +[System--Maintenance--Clear Semaphores] +module=am.pl +action=clear_semaphores -[Batch--Print--Bin Lists] -module=bp.pl -action=search -type=bin_list -batch=print +[System--Maintenance--Lock Dataset] +module=am.pl +action=lock_dataset -[Batch--Print--RFQs] -module=bp.pl -action=search -type=request_quotation -batch=print +[System--Maintenance--Unlock Dataset] +module=am.pl +action=unlock_dataset -[Batch--Print--Time Cards] -module=bp.pl -action=search -type=timecard -batch=print +[System--Maintenance--Restore] +module=am.pl +action=restore -[Batch--Print--Stores Cards] -module=bp.pl -action=search -type=storescard -batch=print +[System--Maintenance--Monitor] +module=am.pl +action=monitor -[Batch--Email] +[System--Backup] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Batch--Email--Sales Invoices] -module=bp.pl -action=search -type=invoice -vc=customer -batch=email +[System--Backup--Send by E-Mail] +module=am.pl +action=backup +media=email -[Batch--Email--Remittance Vouchers] -module=bp.pl -action=search -type=remittance_voucher -vc=customer -batch=email +[System--Backup--Save to File] +module=am.pl +action=backup +media=file -[Batch--Email--Sales Orders] -module=bp.pl -action=search -type=sales_order -batch=email +[System--Backup--Download Dump] +module=am.pl +action=pg_dump -[Batch--Email--Work Orders] -module=bp.pl -action=search -type=work_order -batch=email +[System--Backup--Snapshots] +module=am.pl +action=list_snapshots -[Batch--Email--Quotations] -module=bp.pl -action=search -type=sales_quotation -batch=email +[System--Reference Documents] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 -[Batch--Email--Packing Lists] -module=bp.pl -action=search -type=packing_list -batch=email +[System--Reference Documents--Add Document] +module=rd.pl +action=add_document -[Batch--Email--Pick Lists] -module=bp.pl -action=search -type=pick_list -batch=email +[System--Reference Documents--List Documents] +module=rd.pl +action=search_documents -[Batch--Email--Vendor Invoices] -module=bp.pl -action=search -type=invoice -vc=vendor -batch=email +[System--Image Files] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 -[Batch--Email--Purchase Orders] -module=bp.pl -action=search -type=purchase_order -batch=email +[System--Image Files--Add File] +module=rd.pl +action=upload_image -[Batch--Email--Bin Lists] -module=bp.pl -action=search -type=bin_list -batch=email +[System--Image Files--List Files] +module=rd.pl +action=list_images -[Batch--Email--RFQs] -module=bp.pl -action=search -type=request_quotation -batch=email +[System--Batch] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 -[Batch--Queue] +[System--Batch--Print] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[Batch--Queue--Sales Invoices] +[System--Batch--Print--Sales Invoices] module=bp.pl action=search type=invoice vc=customer -batch=queue +batch=print -[Batch--Queue--Remittance Vouchers] +[System--Batch--Print--Remittance Vouchers] module=bp.pl action=search type=remittance_voucher vc=customer -batch=queue +batch=print -[Batch--Queue--Sales Orders] +[System--Batch--Print--Sales Orders] module=bp.pl action=search type=sales_order -batch=queue +batch=print -[Batch--Queue--Work Orders] +[System--Batch--Print--Work Orders] module=bp.pl action=search type=work_order -batch=queue +batch=print -[Batch--Queue--Quotations] +[System--Batch--Print--Quotations] module=bp.pl action=search type=sales_quotation -batch=queue +batch=print -[Batch--Queue--Packing Lists] +[System--Batch--Print--Packing Lists] module=bp.pl action=search type=packing_list -batch=queue +batch=print -[Batch--Queue--Pick Lists] +[System--Batch--Print--Pick Lists] module=bp.pl action=search type=pick_list -batch=queue +batch=print -[Batch--Queue--Vendor Invoices] +[System--Batch--Print--Vendor Invoices] module=bp.pl action=search type=invoice vc=vendor -batch=queue +batch=print -[Batch--Queue--Purchase Orders] +[System--Batch--Print--Purchase Orders] module=bp.pl action=search type=purchase_order -batch=queue +batch=print -[Batch--Queue--Bin Lists] +[System--Batch--Print--Bin Lists] module=bp.pl action=search type=bin_list -batch=queue +batch=print -[Batch--Queue--RFQs] +[System--Batch--Print--RFQs] module=bp.pl action=search type=request_quotation -batch=queue +batch=print -[Batch--Queue--Time Cards] +[System--Batch--Print--Time Cards] module=bp.pl action=search type=timecard -batch=queue - -[Batch--Queue--Stores Cards] -module=bp.pl -action=search -type=storescard -batch=queue - -[Exchange Rates] -module=am.pl -action=search_exchangerates - -[Import] - -[Import--Customers] -module=im.pl -action=import -type=customer - -[Import--Vendors] -module=im.pl -action=import -type=vendor - -[Import--Parts] -module=im.pl -action=import -type=part - -[Import--Services] -module=im.pl -action=import -type=service - -[Import--Labor/Overhead] -module=im.pl -action=import -type=labor - -[Import--Sales Invoices] -module=im.pl -action=import -type=sales_invoice - -[Import--Groups] -module=im.pl -action=import -type=partsgroup - -[Import--Payments] -module=im.pl -action=import -type=payment - -[Import--Sales Orders] -module=im.pl -action=import -type=sales_order - -[Import--Purchase Orders] -module=im.pl -action=import -type=purchase_order - -[Import--Chart of Accounts] -module=im.pl -action=import -type=coa - -[Import--General Ledger] -module=im.pl -action=import -type=gl - -[Import--QR AP Transaction] -module=im.pl -action=import_qrbill -type=qr_transaction - -[Import--QR Vendor Invoice] -module=im.pl -action=import_qrbill -type=qr_invoice - -[Export] - -[Export--Customers] -module=im.pl -action=export -type=customer - -[Export--Vendors] -module=im.pl -action=export -type=vendor - -[Export--Payments] -module=im.pl -action=export -type=payment - -[System] -[System--Defaults] -module=am.pl -action=defaults - -[System--Audit Control] -module=am.pl -action=audit_control - -[System--Audit Log] -module=am.pl -action=audit_log - -[System--Bank Accounts] -module=am.pl -action=bank_accounts - -[System--Taxes] -module=am.pl -action=taxes - -[System--Currencies] -module=am.pl -action=list_currencies - -[System--Payment Methods] -module=am.pl -action=list_paymentmethod - -[System--Workstations] -module=am.pl -action=workstations - -[System--Roles] -module=am.pl -action=list_roles - -[System--Warehouses] -module=am.pl -action=list_warehouse - -[System--Departments] -module=am.pl -action=list_department - -[System--Type of Business] -module=am.pl -action=list_business - -[System--Language] -module=am.pl -action=list_language - -[System--Mimetypes] -module=am.pl -action=list_mimetypes - -[System--SIC] -module=am.pl -action=list_sic - -[System--Yearend] -module=am.pl -action=yearend +batch=print -[System--Maintenance] +[System--Batch--Print--Stores Cards] +module=bp.pl +action=search +type=storescard +batch=print + +[System--Batch--Email] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[System--Maintenance--Repost Invoices] -module=sm.pl -action=repost_invoices +[System--Batch--Email--Sales Invoices] +module=bp.pl +action=search +type=invoice +vc=customer +batch=email -[System--Maintenance--Mapfile] -module=am.pl -action=list_templates -file=templates=/import.map +[System--Batch--Email--Remittance Vouchers] +module=bp.pl +action=search +type=remittance_voucher +vc=customer +batch=email -[System--Maintenance--Clear Semaphores] -module=am.pl -action=clear_semaphores +[System--Batch--Email--Sales Orders] +module=bp.pl +action=search +type=sales_order +batch=email -[System--Maintenance--Lock Dataset] -module=am.pl -action=lock_dataset +[System--Batch--Email--Work Orders] +module=bp.pl +action=search +type=work_order +batch=email -[System--Maintenance--Unlock Dataset] -module=am.pl -action=unlock_dataset +[System--Batch--Email--Quotations] +module=bp.pl +action=search +type=sales_quotation +batch=email -[System--Maintenance--Restore] -module=am.pl -action=restore +[System--Batch--Email--Packing Lists] +module=bp.pl +action=search +type=packing_list +batch=email -[System--Maintenance--Monitor] -module=am.pl -action=monitor +[System--Batch--Email--Pick Lists] +module=bp.pl +action=search +type=pick_list +batch=email -[System--Backup] +[System--Batch--Email--Vendor Invoices] +module=bp.pl +action=search +type=invoice +vc=vendor +batch=email + +[System--Batch--Email--Purchase Orders] +module=bp.pl +action=search +type=purchase_order +batch=email + +[System--Batch--Email--Bin Lists] +module=bp.pl +action=search +type=bin_list +batch=email + +[System--Batch--Email--RFQs] +module=bp.pl +action=search +type=request_quotation +batch=email + +[System--Batch--Queue] module=menu.pl action=acc_menu target=acc_menu submenu=1 -[System--Backup--Send by E-Mail] -module=am.pl -action=backup -media=email +[System--Batch--Queue--Sales Invoices] +module=bp.pl +action=search +type=invoice +vc=customer +batch=queue -[System--Backup--Save to File] -module=am.pl -action=backup -media=file +[System--Batch--Queue--Remittance Vouchers] +module=bp.pl +action=search +type=remittance_voucher +vc=customer +batch=queue -[System--Backup--Download Dump] -module=am.pl -action=pg_dump +[System--Batch--Queue--Sales Orders] +module=bp.pl +action=search +type=sales_order +batch=queue -[System--Backup--Snapshots] -module=am.pl -action=list_snapshots +[System--Batch--Queue--Work Orders] +module=bp.pl +action=search +type=work_order +batch=queue -[System--Chart of Accounts] -module=menu.pl -action=acc_menu -target=acc_menu -submenu=1 +[System--Batch--Queue--Quotations] +module=bp.pl +action=search +type=sales_quotation +batch=queue -[System--Chart of Accounts--Add Account] -module=am.pl -action=add_account +[System--Batch--Queue--Packing Lists] +module=bp.pl +action=search +type=packing_list +batch=queue -[System--Chart of Accounts--List Accounts] -module=am.pl -action=list_account +[System--Batch--Queue--Pick Lists] +module=bp.pl +action=search +type=pick_list +batch=queue -[System--Chart of Accounts--Translations] -module=pe.pl -action=translation -translation=chart +[System--Batch--Queue--Vendor Invoices] +module=bp.pl +action=search +type=invoice +vc=vendor +batch=queue -[System--Chart of Accounts--Add GIFI] -module=am.pl -action=add_gifi +[System--Batch--Queue--Purchase Orders] +module=bp.pl +action=search +type=purchase_order +batch=queue -[System--Chart of Accounts--List GIFI] -module=am.pl -action=list_gifi +[System--Batch--Queue--Bin Lists] +module=bp.pl +action=search +type=bin_list +batch=queue + +[System--Batch--Queue--RFQs] +module=bp.pl +action=search +type=request_quotation +batch=queue + +[System--Batch--Queue--Time Cards] +module=bp.pl +action=search +type=timecard +batch=queue + +[System--Batch--Queue--Stores Cards] +module=bp.pl +action=search +type=storescard +batch=queue [System--html Templates] module=menu.pl @@ -1906,28 +1874,113 @@ module=am.pl action=list_templates file=templates=/payslip.txt -[Preferences] -module=am.pl -action=config +[System--Import] +module=menu.pl +action=acc_menu +target=acc_menu +submenu=1 -[New Window] +[System--Import--Customers] +module=im.pl +action=import +type=customer + +[System--Import--Vendors] +module=im.pl +action=import +type=vendor + +[System--Import--Parts] +module=im.pl +action=import +type=part + +[System--Import--Services] +module=im.pl +action=import +type=service + +[System--Import--Labor/Overhead] +module=im.pl +action=import +type=labor + +[System--Import--Sales Invoices] +module=im.pl +action=import +type=sales_invoice + +[System--Import--Groups] +module=im.pl +action=import +type=partsgroup + +[System--Import--Payments] +module=im.pl +action=import +type=payment + +[System--Import--Sales Orders] +module=im.pl +action=import +type=sales_order + +[System--Import--Purchase Orders] +module=im.pl +action=import +type=purchase_order + +[System--Import--Chart of Accounts] +module=im.pl +action=import +type=coa + +[System--Import--General Ledger] +module=im.pl +action=import +type=gl + +[System--Import--QR AP Transaction] +module=im.pl +action=import_qrbill +type=qr_transaction + +[System--Import--QR Vendor Invoice] +module=im.pl +action=import_qrbill +type=qr_invoice + +[System--Export] module=menu.pl -action=display -main=list_recent -target=_blank +action=acc_menu +target=acc_menu +submenu=1 -[Recently Used] -module=ru.pl -action=list_recent +[System--Export--Customers] +module=im.pl +action=export +type=customer + +[System--Export--Vendors] +module=im.pl +action=export +type=vendor + +[System--Export--Payments] +module=im.pl +action=export +type=payment [Documentation] module=NULL href=doc/index.html target=_blank -[Version] -module=am.pl -action=company_logo +[New Window] +module=menu.pl +action=display +main=list_recent +target=_blank [Logout] module=login.pl From 8a7f37f829e4c4d98e1024728b85a02bde24409a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsirafovics=20=28Gy=C3=B6rgy=20T=C3=B3th-Szab=C3=B3=29?= Date: Tue, 20 Jan 2026 15:04:21 +0100 Subject: [PATCH 3/3] CORE: menu.pl refactor and Menu.pm adjusting according to HTML5, external JS --- SL/Menu.pm | 54 ++++++++-- bin/mozilla/menu.pl | 244 +++++++++++++++++++++++++++++--------------- js/menu-frame.js | 176 ++++++++++++++++++++++++++++++++ 3 files changed, 380 insertions(+), 94 deletions(-) create mode 100644 js/menu-frame.js diff --git a/SL/Menu.pm b/SL/Menu.pm index feda30e10..f14f3f94a 100644 --- a/SL/Menu.pm +++ b/SL/Menu.pm @@ -16,6 +16,20 @@ package SL::Menu; use SL::Inifile; use parent 'SL::Inifile'; +sub _url ($form, $s) { + $s = '' if !defined $s; + return $form->escape($s, 1); +} + +sub _ha ($s) { + $s = '' if !defined $s; + $s =~ s/&/&/g; + $s =~ s//>/g; + $s =~ s/"/"/g; + return $s; +} + sub menuitem ($self, $myconfig, $form, $item, $) { @@ -23,16 +37,21 @@ sub menuitem ($self, $myconfig, $form, $item, $) { my $action = ($self->{$item}{action}) ? $self->{$item}{action} : "section_menu"; my $target = ($self->{$item}{target}) ? $self->{$item}{target} : ""; - my $level = $form->escape($item); - my $login = $form->{login}; - $login =~ s/ /\%20/; + my $legacy = $self->{$item}{jsmenu} ? 1 : 0; - my $str = qq|{path}&action=$action&level=$level&login=$login&js=$form->{js}|; + my $href = $module + . '?path=' . _url($form, $form->{path}) + . '&action='. _url($form, $action) + . '&level=' . _url($form, $item) + . '&login=' . _url($form, $form->{login}) + . '&js=' . _url($form, $form->{js}); + + my $str; my @vars = qw(module action target href); if ($self->{$item}{href}) { - $str = qq|{$item}{href}|; + $href = $self->{$item}{href}; @vars = qw(module target href); } @@ -40,22 +59,35 @@ sub menuitem ($self, $myconfig, $form, $item, $) { delete $self->{$item}{submenu}; - # add other params - foreach my $key (keys %{ $self->{$item} }) { - $str .= "&".$form->escape($key)."="; + foreach my $key (keys %{ $self->{$item} // {} }) { + $href .= "&" . _url($form, $key) . "="; my ($value, $conf) = split /=/, $self->{$item}{$key}, 2; $value = "$myconfig->{$value}$conf" if $self->{$item}{$key} =~ /=/; - $str .= $form->escape($value); + $href .= _url($form, $value); + } + + my $tag = $form->{tag} // 0; + $href .= qq|#id$tag| if $target eq 'acc_menu' && !$form->{js}; + + if ($legacy) { + $str = qq||; + return $str; } - $str .= qq|#id$form->{tag}| if $target eq 'acc_menu'; + my $href_html = _ha($href); + $str = qq||; + return $str; } diff --git a/bin/mozilla/menu.pl b/bin/mozilla/menu.pl index db6958fa1..6b4f21157 100644 --- a/bin/mozilla/menu.pl +++ b/bin/mozilla/menu.pl @@ -12,32 +12,94 @@ $menufile = "menu.ini"; use SL::Menu; +use SL::AM; require "$form->{path}/js.pl"; 1; # end of main +sub _h { + my ($s) = @_; + $s = '' if !defined $s; + $s =~ s/&/&/g; + $s =~ s//>/g; + $s =~ s/"/"/g; + return $s; +} -sub display { - $menuwidth = $myconfig{menuwidth} || 155; - $menuwidth = '25%' if $form->{small_device}; - $script = $form->{main} =~ /recent/ ? 'ru.pl' : 'am.pl'; +sub menu_env_html { + my ($form, $locale, $myconfig) = @_; - $form->{title} = "$form->{login} - SQL-Ledger"; - $form->{frameset} = 1; - $form->header; + my $env = $form->environment // ''; - print qq| + my %env_label = ( + dev => $locale->text('Development Environment'), + test => $locale->text('Test Environment'), + ); + + my $env_txt = _h($env_label{$env} // ''); - + my $company_raw = $form->{company} // $myconfig->{company} // $myconfig->{dbname} // ''; + my $company = _h($company_raw); + my $user = _h($myconfig->{name} // ''); + my $db = _h($myconfig->{dbname} // ''); - - + my $u = _h($locale->text('User')); + my $d = _h($locale->text('Dataset')); - + my $html = qq||; + + return $html; +} + +sub display { + $form->{js} = 1 if !defined($form->{js}) || $form->{js} eq ''; + + $menuwidth = $myconfig{menuwidth} || 275; + $menuwidth = '25%' if $form->{small_device}; + $script = $form->{main} =~ /recent/ ? 'ru.pl' : 'am.pl'; + + my $menu_css_width = $menuwidth; + $menu_css_width .= 'px' if $menu_css_width =~ /^\d+$/; + + $form->header; + +print qq| + + + + |; @@ -45,6 +107,11 @@ sub display { sub acc_menu { + $form->{js} = 1 if !defined($form->{js}) || $form->{js} eq ''; + + if (!defined $form->{company}) { + eval { SL::AM->company_defaults(\%myconfig, $form); 1 }; + } my $menu = SL::Menu->new("$menufile"); $menu->add_file("$form->{path}/custom/$menufile") if -f "$form->{path}/custom/$menufile"; @@ -54,41 +121,49 @@ sub acc_menu { $form->header; - print qq| - + my $js_src_html = $js_src; + $js_src_html =~ s/&/&/g; + $js_src_html =~ s/"/"/g; + $js_src_html =~ s//>/g; - + my $env_html = menu_env_html($form, $locale, \%myconfig); - - -
$myconfig{name} + print qq| + + + +|; + + print qq| \n| if $form->{js}; + print qq| @@ -165,82 +240,86 @@ sub section_menu { sub jsmenu_frame { - my ($menu, $level) = @_; + my ($menu, $level, $state) = @_; + $state //= { i => 0, root_actions => [] }; + $state->{root_actions} //= []; - # build tiered menus my @menuorder = $menu->access_control(\%myconfig, $level); - while (@menuorder){ - $i++; - $item = shift @menuorder; - $label = $item; - $label =~ s/.*--//g; + while (@menuorder) { + $state->{i}++; + my $i = $state->{i}; + my $item = shift @menuorder; + + (my $label = $item) =~ s/.*--//g; $label = $locale->text($label); + my $label_html = ($label =~ /{$item}{target} = "main_window" unless $menu->{$item}{target}; - if ($menu->{$item}{submenu}) { + my $is_leaf = ($menu->{$item}{module} || $menu->{$item}{href}) && !$menu->{$item}{submenu}; - $display = "display: none;" unless $level eq ' '; + if (!$is_leaf) { + my $subid = "sub$i"; - print qq| - - |; } else { + my $is_root = (!defined($level) || $level eq ''); + my $t = $menu->{$item}{target} // ''; + my $m = $menu->{$item}{module} // ''; + my $act = $menu->{$item}{action} // ''; + my $is_root_action = $is_root && ( + $t =~ /^_(?:blank|top)$/i + || ($m eq 'login.pl' && $act eq 'logout') + ); - if ($menu->{$item}{module}) { - if ($level eq "") { - print qq|
|; - - # remove same level items - map { shift @menuorder } grep /^$item/, @menuorder; + my $a = $menu->menuitem(\%myconfig, $form, $item, $level); + $a =~ s/^ |. - $menu->menuitem(\%myconfig, $form, $item, $level).qq|$label|; - } + my $html = qq|
$a$label_html
\n|; + if ($is_root_action) { + push @{ $state->{root_actions} }, $html; } else { - - $display = "display: none;" unless $item eq ' '; - - print qq| - - -|; - + print $html; } - } - } - } sub jsmenu { my ($menu, $level) = @_; - # build menu_{login}.js for user + # Legacy JS menu generator (menu_{login}.js) is deprecated. + # By default it is disabled. Enable ONLY for debugging/compatibility: + # SetEnv SQLLEDGER_ALLOW_LEGACY_JSMENU 1 (Apache) + # or export SQLLEDGER_ALLOW_LEGACY_JSMENU=1 for the CGI environment. + if (!$ENV{SQLLEDGER_ALLOW_LEGACY_JSMENU}) { + $form->{items} = 0; + $form->{stagger} = ''; + $form->{jsmenu} = ''; # empty payload; wrapper output remains valid + return; + } + my @menuorder = $menu->access_control(\%myconfig, $level); while (@menuorder){ @@ -256,7 +335,6 @@ sub jsmenu { $form->{jsmenu} .= $form->{stagger}; $form->{jsmenu} .= qq|['$label', null, null,\n|; - # remove same level items map { shift @menuorder } grep /^$item/, @menuorder; $form->{stagger} .= "\t"; diff --git a/js/menu-frame.js b/js/menu-frame.js new file mode 100644 index 000000000..a24e6df05 --- /dev/null +++ b/js/menu-frame.js @@ -0,0 +1,176 @@ +(function () { + 'use strict'; + + const KEY_OPEN = 'sql-ledger.menu.open'; + const KEY_ACTIVE = 'sql-ledger.menu.active'; + + function safeJsonParse(raw, fallback) { + try { return JSON.parse(raw); } catch (_) { return fallback; } + } + + function loadOpenSet() { + const raw = sessionStorage.getItem(KEY_OPEN); + const arr = safeJsonParse(raw || '[]', []); + return new Set(Array.isArray(arr) ? arr : []); + } + + function saveOpenSet(openSet) { + try { sessionStorage.setItem(KEY_OPEN, JSON.stringify(Array.from(openSet))); } catch (_) {} + } + + function resetStoredState() { + try { + sessionStorage.removeItem(KEY_OPEN); + sessionStorage.removeItem(KEY_ACTIVE); + } catch (_) {} + } + + function shouldResetOnLoad() { + try { + const last = sessionStorage.getItem(KEY_ACTIVE) || ''; + if (!last) return false; + + let s = last; + try { s = decodeURIComponent(last); } catch (_) {} + + return /action=logout\b/i.test(s) || /login\.pl\b/i.test(s); + } catch (_) { + return false; + } + } + + function getPanelForButton(btn) { + const panel = btn.nextElementSibling; + if (panel && panel.classList && panel.classList.contains('submenu')) return panel; + return null; + } + + function isTopLevelButton(btn) { + return !btn.closest('.submenu'); + } + + function closeSubtree(openSet, panel) { + // Zárjunk be minden nyitott panelt a subtree-ben (gombpanel párok) + panel.querySelectorAll('button.menu-header.open').forEach((b) => { + const p = getPanelForButton(b); + if (!p) return; + setOpen(b, p, false); + if (p.id) openSet.delete(p.id); + }); + + // Biztonság kedvéért: ha a panelek open class-szal vannak nyitva (gomb nélkül), + // azt is zárjuk, és vegyük ki az openSet-ből. + panel.querySelectorAll('.submenu.open').forEach((p) => { + p.classList.remove('open'); + if (p.id) openSet.delete(p.id); + }); + } + + function closeOtherTopLevel(openSet, currentBtn) { + document.querySelectorAll('button.menu-header.open').forEach((btn) => { + if (btn === currentBtn) return; + if (!isTopLevelButton(btn)) return; + + const panel = getPanelForButton(btn); + if (!panel) return; + + closeSubtree(openSet, panel); + setOpen(btn, panel, false); + if (panel.id) openSet.delete(panel.id); + }); + } + + function setOpen(btn, panel, open) { + btn.classList.toggle('open', open); + panel.classList.toggle('open', open); + btn.setAttribute('aria-expanded', open ? 'true' : 'false'); + } + + function setActive(link) { + document.querySelectorAll('.menu-item.active').forEach((n) => n.classList.remove('active')); + const item = link.closest('.menu-item'); + if (item) item.classList.add('active'); + } + + function openAncestors(openSet, panel) { + let p = panel; + while (p) { + const btn = p.previousElementSibling; + if (btn && btn.classList && btn.classList.contains('menu-header')) { + setOpen(btn, p, true); + if (p.id) openSet.add(p.id); + } + p = p.parentElement ? p.parentElement.closest('.submenu') : null; + } + } + + document.addEventListener('DOMContentLoaded', () => { + document.documentElement.setAttribute('data-menu-js', '1'); + + if (shouldResetOnLoad()) { + resetStoredState(); + } + + const openSet = loadOpenSet(); + + document.querySelectorAll('button.menu-header').forEach((btn) => { + const panel = getPanelForButton(btn); + if (!panel) return; + + const shouldOpen = (panel.id && openSet.has(panel.id)); + setOpen(btn, panel, shouldOpen); + }); + + document.addEventListener('click', (ev) => { + const btn = ev.target.closest && ev.target.closest('button.menu-header'); + if (btn) { + const panel = getPanelForButton(btn); + if (!panel) return; + + const nowOpen = !panel.classList.contains('open'); + if (nowOpen && isTopLevelButton(btn)) { + closeOtherTopLevel(openSet, btn); + } + + setOpen(btn, panel, nowOpen); + + if (panel.id) { + if (nowOpen) openSet.add(panel.id); + else openSet.delete(panel.id); + saveOpenSet(openSet); + } + return; + } + + const link = ev.target.closest && ev.target.closest('.menu-item > a'); + if (link) { + setActive(link); + + try { sessionStorage.setItem(KEY_ACTIVE, link.getAttribute('href') || ''); } catch (_) {} + + const panel = link.closest('.submenu'); + if (panel) { + openAncestors(openSet, panel); + saveOpenSet(openSet); + } + } + }); + + try { + const href = sessionStorage.getItem(KEY_ACTIVE); + if (href) { + const link = Array.from(document.querySelectorAll('.menu-item > a')) + .find((a) => (a.getAttribute('href') || '') === href); + + if (link) { + setActive(link); + const panel = link.closest('.submenu'); + if (panel) { + openAncestors(openSet, panel); + saveOpenSet(openSet); + } + } + } + } catch (_) {} + }); +})();