@atyaio/ledgr-web 0.0.0-stage → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/badge-DCLlsDNI.js +55 -0
- package/dist/assets/breakdown-B7xclB2-.js +1 -0
- package/dist/assets/categories-C9LvkWNc.js +1 -0
- package/dist/assets/color-picker-DUPZPbk3.js +1 -0
- package/dist/assets/custom-cell-DOJAsRPW.js +1 -0
- package/dist/assets/data-BX7xFZfR.js +1 -0
- package/dist/assets/download-gNHw92Vi.js +1 -0
- package/dist/assets/expenses-Ct1Tk3pC.js +1 -0
- package/dist/assets/format-GDcQVAp4.js +1 -0
- package/dist/assets/index-B9WjaP25.js +31 -0
- package/dist/assets/index-YWd9JGBA.css +2 -0
- package/dist/assets/insights-C0cl4vss.js +1 -0
- package/dist/assets/integrations-CueFg-5F.js +1 -0
- package/dist/assets/ledger-toolbar-B_Gbv5Ws.js +1 -0
- package/dist/assets/media-D6XgVZ7M.js +1 -0
- package/dist/assets/menu-C-8r2BNA.js +1 -0
- package/dist/assets/money-OFUBQ3gl.js +1 -0
- package/dist/assets/money-input-DQaEauAw.js +1 -0
- package/dist/assets/overview-CZMXeLeG.js +1 -0
- package/dist/assets/payments-D9NCfpzJ.js +1 -0
- package/dist/assets/project-CYHaWZqH.js +1 -0
- package/dist/assets/pull-shift-sheet-BaOiY46Z.js +1 -0
- package/dist/assets/queries-CxLQqNqz.js +1 -0
- package/dist/assets/recurring-e7X3okBc.js +1 -0
- package/dist/assets/revenue-TPYHnUaW.js +1 -0
- package/dist/assets/search-CnrmI1BH.js +1 -0
- package/dist/assets/settings-mDly_aVZ.js +4 -0
- package/dist/assets/shift-sales-BpOCNuGY.js +1 -0
- package/dist/assets/stakeholders-DzTfUHX0.js +1 -0
- package/dist/assets/star-DZj1Tpai.js +1 -0
- package/dist/assets/table-QAdUTXQz.js +1 -0
- package/dist/assets/tooltip-CYNpGhCZ.js +55 -0
- package/dist/favicon.svg +1 -0
- package/dist/icons/add-expense-96.png +0 -0
- package/dist/icons/add-expense.svg +1 -0
- package/dist/icons/add-revenue-96.png +0 -0
- package/dist/icons/add-revenue.svg +1 -0
- package/dist/icons/apple-touch-icon.png +0 -0
- package/dist/icons/icon-192.png +0 -0
- package/dist/icons/icon-512.png +0 -0
- package/dist/icons/icon.svg +1 -0
- package/dist/icons/maskable-192.png +0 -0
- package/dist/icons/maskable-512.png +0 -0
- package/dist/icons/maskable.svg +1 -0
- package/dist/index.html +39 -0
- package/dist/manifest.webmanifest +21 -0
- package/package.json +43 -3
- package/README.md +0 -3
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-mono:var(--font-mono);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-lg:32rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-lg:16px;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html,body,#root{height:100%}body{background:var(--bg);color:var(--ink);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-tap-highlight-color:transparent;overscroll-behavior-y:none;margin:0;font-size:15px;line-height:1.5}@media (width>=768px){body{font-size:14px}}*{border-color:var(--line)}::selection{background:var(--accent-soft)}button,input,select,textarea{font:inherit;color:inherit}input::placeholder,textarea::placeholder{color:var(--ink-3)}:focus-visible{outline:2px solid var(--focus);outline-offset:2px}input,select,textarea{font-size:max(16px,1em)}@media (width>=768px){input,select,textarea{font-size:inherit}}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--line-strong);border:3px solid var(--bg);border-radius:10px}::-webkit-scrollbar-track{background:0 0}}@layer components{.num{font-variant-numeric:tabular-nums;letter-spacing:-.01em}.mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.label{color:var(--ink-3);letter-spacing:.01em;font-size:12px;font-weight:500}.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-lg);box-shadow:var(--shadow-card)}.card-flat{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-lg)}.row-hover:hover{background:var(--card-hover)}.pressable{transition:transform 80ms,background-color .15s}.pressable:active{transform:scale(.98)}.fade-up{animation:.35s cubic-bezier(.2,.7,.2,1) both fadeUp}@keyframes fadeUp{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}.chart-tooltip{background:var(--card);border:1px solid var(--line);box-shadow:var(--shadow-pop);border-radius:12px;padding:10px 12px;font-size:13px}.no-scrollbar::-webkit-scrollbar{display:none}.no-scrollbar{scrollbar-width:none}.safe-bottom{padding-bottom:var(--safe-bottom)}details>summary{list-style:none}details>summary::-webkit-details-marker{display:none}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-x-3{inset-inline:calc(var(--spacing) * 3)}.start-2\.5{inset-inline-start:calc(var(--spacing) * 2.5)}.start-3{inset-inline-start:calc(var(--spacing) * 3)}.start-3\.5{inset-inline-start:calc(var(--spacing) * 3.5)}.end-2{inset-inline-end:calc(var(--spacing) * 2)}.end-2\.5{inset-inline-end:calc(var(--spacing) * 2.5)}.end-3{inset-inline-end:calc(var(--spacing) * 3)}.top-0{top:0}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.top-\[3px\]{top:3px}.right-1\/2{right:50%}.bottom-0{bottom:0}.left-1\/2{left:50%}.z-30{z-index:30}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[70\]{z-index:70}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.-ms-3{margin-inline-start:calc(var(--spacing) * -3)}.ms-0\.5{margin-inline-start:calc(var(--spacing) * .5)}.ms-\[52px\]{margin-inline-start:52px}.ms-auto{margin-inline-start:auto}.-me-2{margin-inline-end:calc(var(--spacing) * -2)}.me-1\.5{margin-inline-end:calc(var(--spacing) * 1.5)}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.-mt-6{margin-top:calc(var(--spacing) * -6)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-px{margin-top:1px}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.size-\[18px\]{width:18px;height:18px}.size-\[22px\]{width:22px;height:22px}.size-\[30px\]{width:30px;height:30px}.size-full{width:100%;height:100%}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-13{height:calc(var(--spacing) * 13)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-36{height:calc(var(--spacing) * 36)}.h-40{height:calc(var(--spacing) * 40)}.h-\[26px\]{height:26px}.h-\[60px\]{height:60px}.h-\[220px\]{height:220px}.h-\[260px\]{height:260px}.h-\[280px\]{height:280px}.h-full{height:100%}.h-px{height:1px}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\[90dvh\]{max-height:90dvh}.max-h-\[92dvh\]{max-height:92dvh}.max-h-\[94dvh\]{max-height:94dvh}.max-h-\[320px\]{max-height:320px}.min-h-0{min-height:0}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-\[18px\]{min-height:18px}.min-h-\[32px\]{min-height:32px}.min-h-\[40px\]{min-height:40px}.min-h-\[60px\]{min-height:60px}.min-h-\[76px\]{min-height:76px}.min-h-\[220px\]{min-height:220px}.min-h-\[320px\]{min-height:320px}.min-h-full{min-height:100%}.w-3{width:calc(var(--spacing) * 3)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-\[44px\]{width:44px}.w-\[84px\]{width:84px}.w-\[150px\]{width:150px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[232px\]{width:232px}.w-\[270px\]{width:270px}.w-full{width:100%}.w-px{width:1px}.max-w-\[52ch\]{max-width:52ch}.max-w-\[200px\]{max-width:200px}.max-w-\[320px\]{max-width:320px}.max-w-\[360px\]{max-width:360px}.max-w-\[380px\]{max-width:380px}.max-w-\[1400px\]{max-width:1400px}.max-w-lg{max-width:var(--container-lg)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-\[160px\]{min-width:160px}.min-w-\[200px\]{min-width:200px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.translate-x-\[3px\]{--tw-translate-x:3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[21px\]{--tw-translate-x:21px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-y{resize:vertical}.\[scrollbar-width\:none\]{scrollbar-width:none}.list-decimal{list-style-type:decimal}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[1fr_1fr_1\.4fr\]{grid-template-columns:1fr 1fr 1.4fr}.grid-cols-\[1fr_80px\]{grid-template-columns:1fr 80px}.grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-\[2px\]{gap:2px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-line>:not(:last-child)){border-color:var(--line)}.justify-self-center{justify-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[5px\]{border-radius:5px}.rounded-\[8px\]{border-radius:8px}.rounded-\[9px\]{border-radius:9px}.rounded-\[10px\]{border-radius:10px}.rounded-\[11px\]{border-radius:11px}.rounded-\[12px\]{border-radius:12px}.rounded-\[14px\]{border-radius:14px}.rounded-\[16px\]{border-radius:16px}.rounded-\[20px\]{border-radius:20px}.rounded-full{border-radius:2147483647px}.rounded-t-\[24px\]{border-top-left-radius:24px;border-top-right-radius:24px}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-accent{border-color:var(--accent)}.border-critical\/60{border-color:var(--critical)}@supports (color:color-mix(in lab, red, red)){.border-critical\/60{border-color:color-mix(in oklab, var(--critical) 60%, transparent)}}.border-ink{border-color:var(--ink)}.border-line{border-color:var(--line)}.border-line-strong{border-color:var(--line-strong)}.border-primary{border-color:var(--primary)}.border-transparent{border-color:#0000}.border-warning\/40{border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\/40{border-color:color-mix(in oklab, var(--warning) 40%, transparent)}}.bg-\[\#1e9e6a\]{background-color:#1e9e6a}.bg-\[\#1e9e6a\]\/12{background-color:oklab(62.0539% -.12438 .0453214/.12)}.bg-accent{background-color:var(--accent)}.bg-accent-soft,.bg-accent-soft\/40{background-color:var(--accent-soft)}@supports (color:color-mix(in lab, red, red)){.bg-accent-soft\/40{background-color:color-mix(in oklab, var(--accent-soft) 40%, transparent)}}.bg-accent-soft\/50{background-color:var(--accent-soft)}@supports (color:color-mix(in lab, red, red)){.bg-accent-soft\/50{background-color:color-mix(in oklab, var(--accent-soft) 50%, transparent)}}.bg-accent-soft\/60{background-color:var(--accent-soft)}@supports (color:color-mix(in lab, red, red)){.bg-accent-soft\/60{background-color:color-mix(in oklab, var(--accent-soft) 60%, transparent)}}.bg-bg,.bg-bg\/90{background-color:var(--bg)}@supports (color:color-mix(in lab, red, red)){.bg-bg\/90{background-color:color-mix(in oklab, var(--bg) 90%, transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-card,.bg-card\/60{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.bg-card\/60{background-color:color-mix(in oklab, var(--card) 60%, transparent)}}.bg-card\/95{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.bg-card\/95{background-color:color-mix(in oklab, var(--card) 95%, transparent)}}.bg-critical\/10{background-color:var(--critical)}@supports (color:color-mix(in lab, red, red)){.bg-critical\/10{background-color:color-mix(in oklab, var(--critical) 10%, transparent)}}.bg-critical\/70{background-color:var(--critical)}@supports (color:color-mix(in lab, red, red)){.bg-critical\/70{background-color:color-mix(in oklab, var(--critical) 70%, transparent)}}.bg-expense-soft{background-color:var(--expense-soft)}.bg-good\/10{background-color:var(--good)}@supports (color:color-mix(in lab, red, red)){.bg-good\/10{background-color:color-mix(in oklab, var(--good) 10%, transparent)}}.bg-good\/70{background-color:var(--good)}@supports (color:color-mix(in lab, red, red)){.bg-good\/70{background-color:color-mix(in oklab, var(--good) 70%, transparent)}}.bg-line{background-color:var(--line)}.bg-line-strong{background-color:var(--line-strong)}.bg-net\/10{background-color:var(--s-net)}@supports (color:color-mix(in lab, red, red)){.bg-net\/10{background-color:color-mix(in oklab, var(--s-net) 10%, transparent)}}.bg-primary{background-color:var(--primary)}.bg-revenue-soft{background-color:var(--revenue-soft)}.bg-sunken,.bg-sunken\/40{background-color:var(--bg-sunken)}@supports (color:color-mix(in lab, red, red)){.bg-sunken\/40{background-color:color-mix(in oklab, var(--bg-sunken) 40%, transparent)}}.bg-sunken\/60{background-color:var(--bg-sunken)}@supports (color:color-mix(in lab, red, red)){.bg-sunken\/60{background-color:color-mix(in oklab, var(--bg-sunken) 60%, transparent)}}.bg-transparent{background-color:#0000}.bg-warning\/10{background-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.bg-warning\/10{background-color:color-mix(in oklab, var(--warning) 10%, transparent)}}.bg-warning\/12{background-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.bg-warning\/12{background-color:color-mix(in oklab, var(--warning) 12%, transparent)}}.bg-white{background-color:var(--color-white)}.object-contain{object-fit:contain}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.ps-1{padding-inline-start:var(--spacing)}.ps-2{padding-inline-start:calc(var(--spacing) * 2)}.ps-3{padding-inline-start:calc(var(--spacing) * 3)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.ps-8{padding-inline-start:calc(var(--spacing) * 8)}.ps-9{padding-inline-start:calc(var(--spacing) * 9)}.ps-14{padding-inline-start:calc(var(--spacing) * 14)}.ps-16{padding-inline-start:calc(var(--spacing) * 16)}.pe-1{padding-inline-end:var(--spacing)}.pe-2{padding-inline-end:calc(var(--spacing) * 2)}.pe-3{padding-inline-end:calc(var(--spacing) * 3)}.pe-6{padding-inline-end:calc(var(--spacing) * 6)}.pe-7{padding-inline-end:calc(var(--spacing) * 7)}.pe-9{padding-inline-end:calc(var(--spacing) * 9)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-28{padding-bottom:calc(var(--spacing) * 28)}.pb-\[max\(8px\,var\(--safe-bottom\)\)\]{padding-bottom:max(8px, var(--safe-bottom))}.pb-\[max\(12px\,var\(--safe-bottom\)\)\]{padding-bottom:max(12px, var(--safe-bottom))}.text-center{text-align:center}.text-end{text-align:end}.text-start{text-align:start}.align-middle{vertical-align:middle}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[20px\]{font-size:20px}.text-\[22px\]{font-size:22px}.text-\[24px\]{font-size:24px}.text-\[26px\]{font-size:26px}.text-\[32px\]{font-size:32px}.text-\[34px\]{font-size:34px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.02em\]{--tw-tracking:-.02em;letter-spacing:-.02em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#1e9e6a\]{color:#1e9e6a}.text-accent,.text-accent\/80{color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.text-accent\/80{color:color-mix(in oklab, var(--accent) 80%, transparent)}}.text-critical{color:var(--critical)}.text-expense{color:var(--s-expense)}.text-good{color:var(--good)}.text-ink{color:var(--ink)}.text-ink-2{color:var(--ink-2)}.text-ink-3{color:var(--ink-3)}.text-ink-4{color:var(--ink-4)}.text-net{color:var(--s-net)}.text-primary-ink{color:var(--primary-ink)}.text-revenue{color:var(--s-revenue)}.text-warning{color:var(--warning)}.text-white{color:var(--color-white)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.accent-\[var\(--accent\)\]{accent-color:var(--accent)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--shadow-pop\)\]{--tw-shadow:var(--shadow-pop);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-500{--tw-duration:.5s;transition-duration:.5s}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:text-ink-2:is(:where(.group):hover *){color:var(--ink-2)}}.placeholder\:text-ink-3::placeholder{color:var(--ink-3)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-accent:hover{border-color:var(--accent)}.hover\:border-ink-3:hover{border-color:var(--ink-3)}.hover\:border-ink-4:hover{border-color:var(--ink-4)}.hover\:bg-card-hover:hover{background-color:var(--card-hover)}.hover\:bg-critical\/15:hover{background-color:var(--critical)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-critical\/15:hover{background-color:color-mix(in oklab, var(--critical) 15%, transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.hover\:text-accent:hover{color:var(--accent)}.hover\:text-ink:hover{color:var(--ink)}.hover\:opacity-90:hover{opacity:.9}.hover\:brightness-95:hover{--tw-brightness:brightness(95%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus\:border-accent:focus{border-color:var(--accent)}.focus\:ring-4:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-accent\/15:focus{--tw-ring-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.focus\:ring-accent\/15:focus{--tw-ring-color:color-mix(in oklab, var(--accent) 15%, transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media not all and (width>=48rem){.max-md\:hidden{display:none}}@media (width>=40rem){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (width>=48rem){.md\:inset-x-auto{inset-inline:auto}.md\:end-5{inset-inline-end:calc(var(--spacing) * 5)}.md\:top-auto{top:auto}.md\:bottom-5{bottom:calc(var(--spacing) * 5)}.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:mb-5{margin-bottom:calc(var(--spacing) * 5)}.md\:block{display:block}.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:inline{display:inline}.md\:h-9{height:calc(var(--spacing) * 9)}.md\:h-10{height:calc(var(--spacing) * 10)}.md\:w-48{width:calc(var(--spacing) * 48)}.md\:w-\[220px\]{width:220px}.md\:w-\[360px\]{width:360px}.md\:w-auto{width:auto}.md\:max-w-\[320px\]{max-width:320px}.md\:flex-none{flex:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-\[1fr_1fr_1\.4fr\]{grid-template-columns:1fr 1fr 1.4fr}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:items-end{align-items:flex-end}.md\:justify-between{justify-content:space-between}.md\:gap-2{gap:calc(var(--spacing) * 2)}.md\:gap-4{gap:calc(var(--spacing) * 4)}.md\:p-5{padding:calc(var(--spacing) * 5)}.md\:px-5{padding-inline:calc(var(--spacing) * 5)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:pb-8{padding-bottom:calc(var(--spacing) * 8)}.md\:text-\[13\.5px\]{font-size:13.5px}.md\:text-\[22px\]{font-size:22px}.md\:text-\[24px\]{font-size:24px}.md\:text-\[26px\]{font-size:26px}.md\:text-\[36px\]{font-size:36px}}@media (width>=80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.\[\&\>\*\]\:w-full>*{width:100%}.\[\&\>button\]\:flex-1>button{flex:1}.\[\&\>svg\]\:size-8>svg{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.\[\&\>svg\]\:size-\[18px\]>svg{width:18px;height:18px}@media (width>=48rem){.md\:\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.last\:\[\&\>td\]\:border-b-0:last-child>td{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}:root{--font-sans:"Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;--font-mono:"Geist Mono", ui-monospace, "SF Mono", Menlo, monospace;--bg:#f4f5f7;--bg-sunken:#eceef1;--card:#fff;--card-hover:#f8f9fb;--line:#e6e8ec;--line-strong:#d3d7de;--ink:#15181e;--ink-2:#5b6473;--ink-3:#8a93a3;--ink-4:#c0c6d0;--primary:#15181e;--primary-ink:#fff;--accent:#2f5bea;--accent-soft:#e9eefc;--focus:#2f5bea59;--s-revenue:#1baf7a;--s-expense:#eb6834;--s-net:#2a78d6;--s-4:#eda100;--s-5:#e87ba4;--s-6:#6250d6;--s-7:#e34948;--s-other:#9aa0ab;--revenue-soft:#e4f6ee;--expense-soft:#fdeae2;--good:#0ca30c;--warning:#d98e00;--serious:#ec835a;--critical:#d03b3b;--shadow-card:0 1px 2px #1018280a, 0 1px 3px #1018280a;--shadow-pop:0 12px 32px -12px #10182840, 0 2px 6px #1018280f;--safe-bottom:env(safe-area-inset-bottom,0px);--safe-top:env(safe-area-inset-top,0px);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#0f1115;--bg-sunken:#0a0c0f;--card:#171a20;--card-hover:#1d2129;--line:#262a33;--line-strong:#353b47;--ink:#eceef2;--ink-2:#a3abb8;--ink-3:#6f7886;--ink-4:#3f4654;--primary:#eceef2;--primary-ink:#0f1115;--accent:#7c9cf5;--accent-soft:#7c9cf529;--focus:#7c9cf573;--s-revenue:#199e70;--s-expense:#d95926;--s-net:#3987e5;--s-4:#c98500;--s-5:#d55181;--s-6:#9085e9;--s-7:#e66767;--s-other:#6b7280;--revenue-soft:#199e7029;--expense-soft:#d9592629;--warning:#fab219;--shadow-card:0 1px 0 #ffffff08 inset;--shadow-pop:0 16px 40px -16px #000c;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}:root[data-theme=dark]{--bg:#0f1115;--bg-sunken:#0a0c0f;--card:#171a20;--card-hover:#1d2129;--line:#262a33;--line-strong:#353b47;--ink:#eceef2;--ink-2:#a3abb8;--ink-3:#6f7886;--ink-4:#3f4654;--primary:#eceef2;--primary-ink:#0f1115;--accent:#7c9cf5;--accent-soft:#7c9cf529;--focus:#7c9cf573;--s-revenue:#199e70;--s-expense:#d95926;--s-net:#3987e5;--s-4:#c98500;--s-5:#d55181;--s-6:#9085e9;--s-7:#e66767;--s-other:#6b7280;--revenue-soft:#199e7029;--expense-soft:#d9592629;--warning:#fab219;--shadow-card:0 1px 0 #ffffff08 inset;--shadow-pop:0 16px 40px -16px #000c;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}:root[data-branded]{--primary:var(--brand);--primary-ink:var(--brand-ink);--accent:var(--brand-accent);--accent-soft:var(--brand-soft);--focus:var(--brand-focus)}@media (prefers-color-scheme:dark){:root[data-branded]:not([data-theme=light]){--accent:var(--brand-accent-dark);--accent-soft:var(--brand-soft-dark);--focus:var(--brand-focus-dark)}}:root[data-branded][data-theme=dark]{--accent:var(--brand-accent-dark);--accent-soft:var(--brand-soft-dark);--focus:var(--brand-focus-dark)}:root[lang=ar]{--font-sans:"IBM Plex Sans Arabic", "Geist", ui-sans-serif, system-ui, sans-serif}:root[lang=ar] body{letter-spacing:0}:root[lang=ar] .num,:root[lang=ar] .mono{text-align:right;direction:ltr;unicode-bidi:isolate;font-family:Geist,IBM Plex Sans Arabic,ui-sans-serif,system-ui,sans-serif}[dir=rtl] .rtl-flip{transform:scaleX(-1)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_t as e,d as t,f as n,ft as r,h as i,i as a,l as o,mt as s,o as c,pt as l,s as u,v as d,y as f}from"./badge-DCLlsDNI.js";import{O as p,d as m,i as h,v as g}from"./queries-CxLQqNqz.js";import{n as _}from"./project-CYHaWZqH.js";import{a as v,c as y,d as b,f as x,h as S,i as C,l as w,m as T,n as E,o as D,p as ee,r as te,s as O,t as k,u as A}from"./tooltip-CYNpGhCZ.js";import{a as j,i as M,o as N,r as P,s as F}from"./table-QAdUTXQz.js";import{a as I,c as L,t as R}from"./media-D6XgVZ7M.js";import{S as z,g as B,k as V,p as H,v as U,w as ne}from"./index-B9WjaP25.js";import{r as re,t as W}from"./format-GDcQVAp4.js";import{t as G}from"./money-OFUBQ3gl.js";import{t as K}from"./breakdown-B7xclB2-.js";import{r as q}from"./shift-sales-BpOCNuGY.js";var J=e(s()),ie=[`axis`,`item`],ae=(0,J.forwardRef)((e,t)=>J.createElement(C,{chartName:`BarChart`,defaultTooltipEventType:`axis`,validateTooltipEventTypes:ie,tooltipPayloadSearcher:b,categoricalChartProps:e,ref:t})),oe=l(),Y=r();function X({label:e,options:t,value:n,onChange:r,icon:o}){let[s,c]=(0,J.useState)(!1),l=(0,J.useRef)(null),u=(0,J.useRef)(null),[f,p]=(0,J.useState)(null),m=R(),{t:h}=d(),g=t.filter(e=>n.includes(e.id));(0,J.useEffect)(()=>{if(!s)return;let e=()=>{let e=l.current?.getBoundingClientRect();e&&p({top:e.bottom+6,left:Math.min(e.left,window.innerWidth-280)})};e();let t=e=>{let t=e.target;!l.current?.contains(t)&&!u.current?.contains(t)&&c(!1)},n=e=>e.key===`Escape`&&c(!1);return document.addEventListener(`mousedown`,t),document.addEventListener(`keydown`,n),window.addEventListener(`resize`,e),()=>{document.removeEventListener(`mousedown`,t),document.removeEventListener(`keydown`,n),window.removeEventListener(`resize`,e)}},[s]);let _=e=>r(n.includes(e)?n.filter(t=>t!==e):[...n,e]),v=g.length===0?h(`All`):g.length===1?g[0].label:h(`{n} selected`,{n:g.length}),y=(0,Y.jsxs)(`ul`,{className:`max-h-[320px] overflow-y-auto py-1`,children:[t.map(e=>{let t=n.includes(e.id);return(0,Y.jsx)(`li`,{children:(0,Y.jsxs)(`button`,{type:`button`,onClick:()=>_(e.id),className:`w-full flex items-center gap-2.5 px-3 h-10 md:h-9 text-start text-[14px] md:text-[13.5px] hover:bg-card-hover`,children:[(0,Y.jsx)(`span`,{className:i(`size-[18px] rounded-[5px] border inline-flex items-center justify-center shrink-0`,t?`bg-accent border-accent text-white`:`border-line-strong`),children:t&&(0,Y.jsx)(ne,{className:`size-3`})}),e.color&&(0,Y.jsx)(a,{color:e.color}),(0,Y.jsx)(`span`,{className:`flex-1 truncate`,children:e.label}),e.hint&&(0,Y.jsx)(`span`,{className:`text-[12px] text-ink-3`,children:e.hint})]})},e.id)}),!t.length&&(0,Y.jsx)(`li`,{className:`px-3 py-3 text-[13px] text-ink-3`,children:h(`Nothing to filter by yet.`)})]});return(0,Y.jsxs)(`div`,{ref:l,className:`relative inline-block`,children:[(0,Y.jsxs)(`button`,{type:`button`,onClick:()=>c(e=>!e),className:i(`h-9 ps-3 pe-2 inline-flex items-center gap-1.5 rounded-full border text-[13.5px] font-medium whitespace-nowrap`,g.length?`bg-primary text-primary-ink border-primary`:`bg-card border-line text-ink-2 hover:text-ink`),children:[o,(0,Y.jsxs)(`span`,{className:`opacity-70`,children:[e,`:`]}),` `,v,g.length?(0,Y.jsx)(`span`,{role:`button`,"aria-label":h(`Clear {label}`,{label:e}),onClick:e=>{e.stopPropagation(),r([])},className:`ms-0.5 inline-flex size-5 items-center justify-center rounded-full hover:bg-white/20`,children:(0,Y.jsx)(L,{className:`size-3.5`})}):(0,Y.jsx)(F,{className:`size-4 opacity-70`})]}),s&&(0,oe.createPortal)(m?(0,Y.jsxs)(`div`,{className:`fixed inset-0 z-50 flex items-end`,children:[(0,Y.jsx)(`div`,{className:`absolute inset-0 bg-black/40`,onClick:()=>c(!1)}),(0,Y.jsxs)(`div`,{ref:u,className:`relative w-full bg-card rounded-t-[24px] pb-[max(12px,var(--safe-bottom))] shadow-2xl`,children:[(0,Y.jsx)(`div`,{className:`mx-auto mt-2.5 h-1.5 w-10 rounded-full bg-line-strong`}),(0,Y.jsx)(`div`,{className:`px-4 pt-3 pb-1 text-[15px] font-semibold`,children:e}),y]})]}):(0,Y.jsx)(`div`,{ref:u,style:{position:`fixed`,top:f?.top??0,left:f?.left??0,zIndex:60,visibility:f?`visible`:`hidden`},className:`w-[270px] card shadow-[var(--shadow-pop)]`,children:y}),document.body)]})}var se=[{id:`both`,label:`Both`},{id:`revenue`,label:`Revenue`},{id:`expenses`,label:`Expenses`}];function ce(){let{t:e,name:r}=d(),{range:i}=H(),[a,s]=V(),c=a.get(`ledger`)||`both`,l=(a.get(`cats`)??``).split(`,`).filter(Boolean),f=(a.get(`methods`)??``).split(`,`).filter(Boolean),_=a.get(`partner`)??``,v=a.get(`g`)??``,y=e=>s(t=>{let n=new URLSearchParams(t);for(let[t,r]of Object.entries(e))r?n.set(t,r):n.delete(t);return n},{replace:!0}),b=h(void 0,!1),x=g(),S=p(),C=m((0,J.useMemo)(()=>({from:i.from,to:i.to,ledger:c,categoryIds:l.join(`,`)||void 0,paymentMethodIds:f.join(`,`)||void 0,stakeholderId:_||void 0,granularity:v||void 0}),[i,c,l.join(`,`),f.join(`,`),_,v])),w=(0,J.useMemo)(()=>(b.data?.items??[]).filter(e=>c===`both`||e.kind===(c===`revenue`?`revenue`:`expense`)).map(t=>({id:t.id,label:r(t),color:t.color,hint:e(t.kind)})),[b.data,c,r,e]),T=(0,J.useMemo)(()=>(x.data?.items??[]).map(e=>({id:e.id,label:r(e),color:e.color})),[x.data,r]);return(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(t,{title:e(`Insights`),subtitle:e(`Slice the ledger by category, payment method and partner, compared with the previous period.`)}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap mb-4`,children:[(0,Y.jsx)(n,{value:c,onChange:e=>y({ledger:e===`both`?null:e,cats:null}),items:se.map(t=>({id:t.id,label:e(t.label)}))}),(0,Y.jsx)(X,{label:e(`Categories`),icon:(0,Y.jsx)(U,{className:`size-4`}),options:w,value:l,onChange:e=>y({cats:e.join(`,`)||null})}),(0,Y.jsx)(X,{label:e(`Payment`),icon:(0,Y.jsx)(z,{className:`size-4`}),options:T,value:f,onChange:e=>y({methods:e.join(`,`)||null})}),(0,Y.jsxs)(`div`,{className:`inline-flex items-center gap-1.5 h-9 ps-3 pe-1 rounded-full border border-line bg-card text-[13.5px] text-ink-2`,children:[(0,Y.jsx)(B,{className:`size-4`}),(0,Y.jsxs)(I,{compact:!0,className:`h-7 border-0 bg-transparent ps-1 pe-7 w-[150px] rounded-full`,value:_,onChange:e=>y({partner:e.target.value||null}),children:[(0,Y.jsx)(`option`,{value:``,children:e(`Partner: all`)}),S.data?.items.map(e=>(0,Y.jsx)(`option`,{value:e.id,children:r(e)},e.id))]})]}),(0,Y.jsx)(`div`,{className:`flex-1`}),(0,Y.jsx)(n,{size:`xs`,value:v||`auto`,onChange:e=>y({g:e===`auto`?null:e}),items:[{id:`auto`,label:e(`Auto`)},{id:`day`,label:e(`Day`)},{id:`week`,label:e(`Week`)},{id:`month`,label:e(`Month`)}]})]}),C.isPending&&(0,Y.jsx)(o,{label:e(`Slicing the ledger`)}),C.isError&&(0,Y.jsx)(u,{title:e(`Could not load insights`),description:C.error.message}),C.data&&(0,Y.jsx)(le,{d:C.data,ledger:c,filtered:!!(l.length||f.length||_)})]})}function Z({value:e,invert:t}){let{t:n}=d();if(e===null||!Number.isFinite(e))return(0,Y.jsx)(`span`,{className:`text-ink-3 text-[12px]`,children:n(`no previous period`)});Math.abs(e)<.05&&(e=0);let r=e>0,a=t?!r:r,o=e===0?ee:r?T:S;return(0,Y.jsxs)(`span`,{className:i(`inline-flex items-center gap-0.5 text-[12px] font-medium`,e===0?`text-ink-3`:a?`text-good`:`text-critical`),children:[(0,Y.jsx)(o,{className:`size-3.5`}),re(e,1),` `,(0,Y.jsx)(`span`,{className:`font-normal text-ink-3`,children:n(`vs previous`)})]})}function le({d:e,ledger:t,filtered:n}){let{t:r,lang:o}=d(),{money:s,date:l}=_(),f=t!==`expenses`,p=t!==`revenue`,m=e.totals;return(0,Y.jsxs)(`div`,{className:i(`space-y-4`,n&&`fade-up`),children:[(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-4 gap-3`,children:[f&&(0,Y.jsx)(Q,{label:r(`Revenue`),value:s(m.revenueMinor),sub:(0,Y.jsx)(Z,{value:e.delta.revenuePct}),extra:r(`{n} entries · avg {avg}`,{n:m.revenueCount,avg:s(m.avgRevenuePerEntryMinor,{compact:!0})})}),p&&(0,Y.jsx)(Q,{label:r(`Expenses`),value:s(m.expenseMinor),sub:(0,Y.jsx)(Z,{value:e.delta.expensePct,invert:!0}),extra:r(`{n} entries · avg {avg}`,{n:m.expenseCount,avg:s(m.avgExpensePerEntryMinor,{compact:!0})})}),f&&p&&(0,Y.jsx)(Q,{label:r(`Net`),value:s(m.netMinor,{signed:!0}),tone:m.netMinor<0?`bad`:void 0,sub:(0,Y.jsx)(Z,{value:e.delta.netPct}),extra:m.marginPct===null?r(`no revenue`):r(`margin {pct}`,{pct:W(m.marginPct,1)})}),f?(0,Y.jsx)(Q,{label:r(`Per day`),value:s(m.avgRevenuePerDayMinor),sub:(0,Y.jsx)(`span`,{className:`text-[12px] text-ink-3`,children:r(`{active} of {days} days active`,{active:m.activeDays,days:e.range.days})}),extra:m.bestDay?r(`best {date} · {amount}`,{date:l(m.bestDay.date,`short`),amount:s(m.bestDay.revenueMinor,{compact:!0})}):void 0}):(0,Y.jsx)(Q,{label:r(`Per day`),value:s(m.avgExpensePerDayMinor),sub:(0,Y.jsx)(`span`,{className:`text-[12px] text-ink-3`,children:r(`{active} of {days} days active`,{active:m.activeDays,days:e.range.days})})})]}),(0,Y.jsx)(c,{title:r(`Trend`),subtitle:r(`By {granularity} · dotted line is the previous period ({from} – {to})`,{granularity:r(e.range.granularity),from:l(e.range.previousFrom,`short`),to:l(e.range.previousTo)}),children:(0,Y.jsx)(`div`,{className:`h-[280px]`,children:(0,Y.jsx)(de,{d:e,showRev:f,showExp:p})})}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4`,children:[f&&(0,Y.jsx)(c,{title:r(`Revenue by category`),children:(0,Y.jsx)(K,{items:e.revenueByCategory.map(e=>({id:e.id,name:e.name,nameAr:e.nameAr,color:e.color,amountMinor:e.revenueMinor,pct:e.pct,count:e.count})),emptyLabel:r(`No revenue`)})}),p&&(0,Y.jsx)(c,{title:r(`Expenses by category`),children:(0,Y.jsx)(K,{items:e.expensesByCategory.map(e=>({id:e.id,name:e.name,nameAr:e.nameAr,color:e.color,amountMinor:e.expenseMinor,pct:e.pct,count:e.count})),emptyLabel:r(`No expenses`)})}),(0,Y.jsx)(c,{title:r(`By payment method`),subtitle:f&&p?r(`Revenue and expenses combined`):void 0,children:(0,Y.jsx)($,{groups:e.byPaymentMethod,showRev:f,showExp:p})}),(0,Y.jsx)(c,{title:r(`By partner`),subtitle:r(`Received by / paid by`),children:(0,Y.jsx)($,{groups:e.byStakeholder,showRev:f,showExp:p})}),(0,Y.jsx)(c,{title:r(`Weekday pattern`),subtitle:r(`Average per day of the week`),className:i(f&&p&&`xl:col-span-2`),children:(0,Y.jsx)(`div`,{className:`h-[220px]`,children:(0,Y.jsx)(fe,{d:e,showRev:f,showExp:p})})})]}),f&&e.posSales&&(0,Y.jsx)(ue,{s:e.posSales}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-4`,children:[(0,Y.jsx)(c,{className:`xl:col-span-2`,title:r(`Month by month`),flush:!0,children:(0,Y.jsxs)(P,{children:[(0,Y.jsx)(`thead`,{children:(0,Y.jsxs)(`tr`,{children:[(0,Y.jsx)(j,{children:r(`Month`)}),f&&(0,Y.jsx)(j,{align:`right`,children:r(`Revenue`)}),p&&(0,Y.jsx)(j,{align:`right`,children:r(`Expenses`)}),f&&p&&(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(j,{align:`right`,children:r(`Net`)}),(0,Y.jsx)(j,{align:`right`,children:r(`Margin`)})]}),(0,Y.jsx)(j,{align:`right`,children:r(`Entries`)})]})}),(0,Y.jsx)(`tbody`,{children:e.byMonth.map(e=>(0,Y.jsxs)(N,{children:[(0,Y.jsx)(M,{className:`font-medium`,children:new Intl.DateTimeFormat(void 0,{month:`long`,year:`numeric`,timeZone:`UTC`}).format(new Date(`${e.month}-01T00:00:00Z`))}),f&&(0,Y.jsx)(M,{align:`right`,children:(0,Y.jsx)(G,{minor:e.revenueMinor})}),p&&(0,Y.jsx)(M,{align:`right`,children:(0,Y.jsx)(G,{minor:e.expenseMinor})}),f&&p&&(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(M,{align:`right`,children:(0,Y.jsx)(G,{minor:e.netMinor,tone:`flow`,signed:!0})}),(0,Y.jsx)(M,{align:`right`,className:`num text-ink-2`,children:e.marginPct===null?`—`:W(e.marginPct,0)})]}),(0,Y.jsx)(M,{align:`right`,className:`num text-ink-2`,children:(f?e.revenueCount:0)+(p?e.expenseCount:0)})]},e.month))})]})}),(0,Y.jsx)(c,{title:r(f?`Largest revenue`:`Largest expenses`),flush:!0,children:(0,Y.jsxs)(`ul`,{className:`divide-y divide-line`,children:[(f?e.topRevenue:e.topExpenses).slice(0,8).map(e=>(0,Y.jsxs)(`li`,{className:`px-4 md:px-5 py-2.5 flex items-center gap-3`,children:[(0,Y.jsx)(a,{color:e.groupColor,size:9}),(0,Y.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,Y.jsx)(`div`,{dir:`auto`,className:`text-[14px] font-medium truncate`,children:e.description}),(0,Y.jsxs)(`div`,{className:`text-[12px] text-ink-3`,children:[e.groupNameAr&&o===`ar`?e.groupNameAr:r(e.groupName),` · `,l(e.date)]})]}),(0,Y.jsx)(G,{minor:e.amountMinor,className:`font-semibold`})]},e.id)),!(f?e.topRevenue:e.topExpenses).length&&(0,Y.jsx)(`li`,{children:(0,Y.jsx)(u,{title:r(`Nothing here`)})})]})})]})]})}function ue({s:e}){let{t}=d(),{money:n,locale:r}=_(),i=e.netMinor>0&&e.costMinor>0?(e.netMinor-e.costMinor)/e.netMinor*100:null;return(0,Y.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-4`,children:[(0,Y.jsx)(c,{className:`xl:col-span-2`,title:t(`Best sellers`),subtitle:t(`From {n} Loyverse shifts in this range · {qty} items · {amount} net`,{n:e.shifts,qty:q(e.quantity,r),amount:n(e.netMinor,{compact:!0})}),flush:!0,children:(0,Y.jsxs)(P,{children:[(0,Y.jsx)(`thead`,{children:(0,Y.jsxs)(`tr`,{children:[(0,Y.jsx)(j,{children:t(`Item`)}),(0,Y.jsx)(j,{children:t(`Category`)}),(0,Y.jsx)(j,{align:`right`,children:t(`Qty`)}),(0,Y.jsx)(j,{align:`right`,children:t(`Net sales`)}),(0,Y.jsx)(j,{align:`right`,children:t(`Share`)})]})}),(0,Y.jsx)(`tbody`,{children:e.byItem.map(e=>(0,Y.jsxs)(N,{children:[(0,Y.jsx)(M,{children:(0,Y.jsxs)(`div`,{dir:`auto`,className:`font-medium truncate max-w-[320px]`,children:[e.itemName,e.variantName?(0,Y.jsxs)(`span`,{className:`text-ink-3 font-normal`,children:[` · `,e.variantName]}):null]})}),(0,Y.jsx)(M,{className:`text-ink-2 text-[13px]`,children:e.categoryName??(0,Y.jsx)(`span`,{className:`text-ink-4`,children:`—`})}),(0,Y.jsx)(M,{align:`right`,className:`num text-ink-2`,children:q(e.quantity,r)}),(0,Y.jsx)(M,{align:`right`,children:(0,Y.jsx)(G,{minor:e.netMinor,className:`font-medium`})}),(0,Y.jsx)(M,{align:`right`,className:`num text-ink-2`,children:W(e.pct,0)})]},`${e.itemName}|${e.variantName??``}`))})]})}),(0,Y.jsx)(c,{title:t(`Sales by category`),subtitle:i===null?void 0:t(`gross margin {pct} after item costs`,{pct:W(i,0)}),children:(0,Y.jsx)(K,{items:e.byCategory.map((e,n)=>({id:e.name||null,name:e.name||t(`Uncategorised`),color:f[n%f.length],amountMinor:e.netMinor,pct:e.pct,count:Math.round(e.quantity)})),emptyLabel:t(`No sales`)})})]})}function Q({label:e,value:t,sub:n,extra:r,tone:a}){return(0,Y.jsxs)(`div`,{className:`card p-4`,children:[(0,Y.jsx)(`div`,{className:`label`,children:e}),(0,Y.jsx)(`div`,{className:i(`num text-[22px] md:text-[24px] font-semibold tracking-tight mt-1`,a===`bad`&&`text-critical`),children:t}),(0,Y.jsx)(`div`,{className:`mt-1 min-h-[18px]`,children:n}),r&&(0,Y.jsx)(`div`,{className:`text-[12px] text-ink-3 mt-0.5 truncate`,children:r})]})}function $({groups:e,showRev:t,showExp:n}){let{t:r,lang:i}=d(),{money:o}=_();if(!e.length)return(0,Y.jsx)(`div`,{className:`text-[13.5px] text-ink-3 py-8 text-center`,children:r(`Nothing in this range`)});let s=e=>(t?e.revenueMinor:0)+(n?e.expenseMinor:0),c=Math.max(1,...e.map(s));return(0,Y.jsx)(`ul`,{className:`space-y-3`,children:e.map(e=>(0,Y.jsxs)(`li`,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between text-[13.5px] mb-1.5`,children:[(0,Y.jsxs)(`span`,{className:`inline-flex items-center gap-2 truncate`,children:[(0,Y.jsx)(a,{color:e.color,size:9}),e.nameAr&&i===`ar`?e.nameAr:r(e.name),(0,Y.jsx)(`span`,{className:`num text-[12px] text-ink-3`,children:e.count})]}),(0,Y.jsxs)(`span`,{className:`num font-medium`,children:[o(s(e)),t&&n&&e.revenueMinor&&e.expenseMinor?(0,Y.jsxs)(`span`,{className:`text-ink-3 font-normal text-[12px]`,children:[` · `,r(`in {in} / out {out}`,{in:o(e.revenueMinor,{compact:!0}),out:o(e.expenseMinor,{compact:!0})})]}):null]})]}),(0,Y.jsxs)(`div`,{className:`h-2 rounded-full bg-sunken overflow-hidden flex gap-[2px]`,children:[t&&e.revenueMinor>0&&(0,Y.jsx)(`div`,{className:`h-full rounded-full`,style:{width:`${e.revenueMinor/c*100}%`,background:n?`var(--s-revenue)`:e.color}}),n&&e.expenseMinor>0&&(0,Y.jsx)(`div`,{className:`h-full rounded-full`,style:{width:`${e.expenseMinor/c*100}%`,background:t?`var(--s-expense)`:e.color}})]})]},e.id??`none`))})}function de({d:e,showRev:t,showExp:n}){let{t:r}=d(),{money:i,date:a,toMajor:o,locale:s}=_(),c=e.range.granularity,l=e=>new Intl.NumberFormat(s,{notation:`compact`,maximumFractionDigits:1}).format(o(e)),u=e=>c===`month`?new Intl.DateTimeFormat(s,{month:`short`,year:`2-digit`,timeZone:`UTC`}).format(new Date(`${e}T00:00:00Z`)):a(e,`short`),f=e.series.map(e=>({...e,label:u(e.bucket)})),p=[...t?[{label:r(`Revenue`),color:`var(--s-revenue)`}]:[],...n?[{label:r(`Expenses`),color:`var(--s-expense)`}]:[],{label:r(`Previous period`),color:`var(--ink-3)`,kind:`line`}];return(0,Y.jsxs)(`div`,{className:`h-full flex flex-col`,children:[(0,Y.jsx)(`div`,{className:`pb-2`,children:(0,Y.jsx)(E,{items:p})}),(0,Y.jsx)(`div`,{className:`flex-1 -ms-3`,children:(0,Y.jsx)(x,{width:`100%`,height:`100%`,children:(0,Y.jsxs)(te,{data:f,margin:{top:12,right:12,bottom:0,left:0},barGap:2,barCategoryGap:`28%`,children:[(0,Y.jsx)(w,{vertical:!1,stroke:`var(--line)`}),(0,Y.jsx)(D,{dataKey:`label`,tickLine:!1,axisLine:{stroke:`var(--line)`},tick:{fill:`var(--ink-3)`,fontSize:11},interval:`preserveStartEnd`,minTickGap:28}),(0,Y.jsx)(v,{tickLine:!1,axisLine:!1,tickFormatter:l,width:48,tick:{fill:`var(--ink-3)`,fontSize:11}}),(0,Y.jsx)(A,{cursor:{fill:`var(--card-hover)`,opacity:.8},content:({active:e,payload:o})=>{if(!e||!o?.length)return null;let s=o[0].payload;return(0,Y.jsx)(k,{title:c===`day`?a(s.bucket,`long`):c===`week`?r(`Week of {date}`,{date:a(s.bucket)}):u(s.bucket),rows:[...t?[{label:r(`Revenue`),value:`${i(s.revenueMinor)} · ${s.revenueCount}`,color:`var(--s-revenue)`},{label:r(`Prev. revenue`),value:i(s.prevRevenueMinor)}]:[],...n?[{label:r(`Expenses`),value:`${i(s.expenseMinor)} · ${s.expenseCount}`,color:`var(--s-expense)`},{label:r(`Prev. expenses`),value:i(s.prevExpenseMinor)}]:[]]})}}),t&&(0,Y.jsx)(O,{dataKey:`revenueMinor`,fill:`var(--s-revenue)`,radius:[4,4,0,0],maxBarSize:24,isAnimationActive:!1}),n&&(0,Y.jsx)(O,{dataKey:`expenseMinor`,fill:`var(--s-expense)`,radius:[4,4,0,0],maxBarSize:24,isAnimationActive:!1}),t&&(0,Y.jsx)(y,{type:`monotone`,dataKey:`prevRevenueMinor`,stroke:`var(--s-revenue)`,strokeDasharray:`4 4`,strokeOpacity:.7,strokeWidth:1.5,dot:!1,isAnimationActive:!1}),n&&(0,Y.jsx)(y,{type:`monotone`,dataKey:`prevExpenseMinor`,stroke:`var(--s-expense)`,strokeDasharray:`4 4`,strokeOpacity:.7,strokeWidth:1.5,dot:!1,isAnimationActive:!1})]})})})]})}function fe({d:e,showRev:t,showExp:n}){let{t:r,lang:i}=d(),{money:a,toMajor:o,locale:s}=_(),c=e=>new Intl.NumberFormat(s,{notation:`compact`,maximumFractionDigits:1}).format(o(e)),l=e.byWeekday.map(e=>({...e,full:r(e.label),label:i===`ar`?r(e.label):r(e.label).slice(0,3)}));return(0,Y.jsx)(x,{width:`100%`,height:`100%`,children:(0,Y.jsxs)(ae,{data:l,margin:{top:12,right:8,bottom:0,left:-8},barGap:2,barCategoryGap:`30%`,children:[(0,Y.jsx)(w,{vertical:!1,stroke:`var(--line)`}),(0,Y.jsx)(D,{dataKey:`label`,tickLine:!1,axisLine:{stroke:`var(--line)`},tick:{fill:`var(--ink-3)`,fontSize:11}}),(0,Y.jsx)(v,{tickLine:!1,axisLine:!1,tickFormatter:c,width:48,tick:{fill:`var(--ink-3)`,fontSize:11}}),(0,Y.jsx)(A,{cursor:{fill:`var(--card-hover)`,opacity:.8},content:({active:e,payload:i})=>{if(!e||!i?.length)return null;let o=i[0].payload;return(0,Y.jsx)(k,{title:r(`{day} · {n} days`,{day:o.full,n:o.days}),rows:[...t?[{label:r(`Avg revenue`),value:a(o.avgRevenueMinor),color:`var(--s-revenue)`}]:[],...n?[{label:r(`Avg expenses`),value:a(o.avgExpenseMinor),color:`var(--s-expense)`}]:[]]})}}),t&&(0,Y.jsx)(O,{dataKey:`avgRevenueMinor`,fill:`var(--s-revenue)`,radius:[4,4,0,0],maxBarSize:28,isAnimationActive:!1}),n&&(0,Y.jsx)(O,{dataKey:`avgExpenseMinor`,fill:`var(--s-expense)`,radius:[4,4,0,0],maxBarSize:28,isAnimationActive:!1})]})})}export{ce as InsightsPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_t as e,d as t,ft as n,g as r,h as i,i as a,k as o,l as s,mt as c,n as l,o as u,s as d,v as f}from"./badge-DCLlsDNI.js";import{f as p,i as m,m as h,p as g,v as _}from"./queries-CxLQqNqz.js";import{n as v}from"./project-CYHaWZqH.js";import{a as y,i as b,o as x,r as S,t as C}from"./table-QAdUTXQz.js";import{t as w}from"./download-gNHw92Vi.js";import{n as ee,t as T}from"./search-CnrmI1BH.js";import{n as E,t as D}from"./pull-shift-sheet-BaOiY46Z.js";import{a as O,i as k,n as A,r as j,s as M,t as N}from"./media-D6XgVZ7M.js";import{_ as P,f as F,h as I,l as te,m as L,u as R,w as z,x as B}from"./index-B9WjaP25.js";import{n as V}from"./format-GDcQVAp4.js";var H={name:`external-link`,size:24,node:[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`M10 14 21 3`,key:`gplh6r`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`,key:`a6xqqp`}]]};H.node;var U=r(H),W={name:`unplug`,size:24,node:[[`path`,{d:`m19 5 3-3`,key:`yk6iyv`}],[`path`,{d:`m2 22 3-3`,key:`19mgm9`}],[`path`,{d:`M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z`,key:`goz73y`}],[`path`,{d:`M7.5 13.5 10 11`,key:`7xgeeb`}],[`path`,{d:`M10.5 16.5 13 14`,key:`10btkg`}],[`path`,{d:`m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z`,key:`1snsnr`}]]};W.node;var ne=r(W),G=e(c(),1),K=n(),q=`https://r.loyverse.com/dashboard/#/integrations/tokens`;function J(){let{t:e}=f(),n=p(),[r,i]=(0,G.useState)(!1);return(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(t,{title:e(`Integrations`),subtitle:e(`Pull data from the systems your business already runs on.`)}),n.isPending?(0,K.jsx)(s,{}):n.isError?(0,K.jsx)(d,{title:e(`Could not load integrations`),description:n.error.message}):n.data.connected?(0,K.jsx)(Z,{i:n.data,onReconnect:()=>i(!0)}):(0,K.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-4`,children:[(0,K.jsx)(u,{className:`xl:col-span-2`,children:(0,K.jsxs)(`div`,{className:`flex items-start gap-4 py-2`,children:[(0,K.jsx)(Y,{}),(0,K.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,K.jsx)(`h3`,{className:`text-[17px] font-semibold tracking-tight`,children:`Loyverse`}),(0,K.jsx)(l,{children:e(`Point of sale`)})]}),(0,K.jsx)(`p`,{className:`text-[13.5px] text-ink-2 mt-1 max-w-[52ch]`,children:e(`Keep the item catalogue in sync and turn each closed shift into a revenue row with one tap, cash only by default.`)}),(0,K.jsx)(`div`,{className:`mt-4`,children:(0,K.jsx)(F,{variant:`primary`,icon:(0,K.jsx)(B,{className:`size-4`}),onClick:()=>i(!0),children:e(`Connect Loyverse`)})})]})]})}),(0,K.jsx)(u,{title:e(`How it works`),children:(0,K.jsxs)(`ol`,{className:`text-[13.5px] text-ink-2 space-y-2 list-decimal ps-4`,children:[(0,K.jsx)(`li`,{children:e(`Create an access token in the Loyverse Back Office and paste it here.`)}),(0,K.jsx)(`li`,{children:e(`Sync items to see the catalogue with its categories.`)}),(0,K.jsx)(`li`,{children:e(`On the Revenue page, tap “Pull last shift” after closing the till.`)})]})})]}),(0,K.jsx)(X,{open:r,onClose:()=>i(!1)})]})}function Y(){return(0,K.jsx)(`span`,{className:`size-12 rounded-[14px] bg-[#1e9e6a]/12 text-[#1e9e6a] inline-flex items-center justify-center shrink-0 font-bold text-[18px] tracking-tight select-none`,"aria-hidden":!0,children:`L`})}function X({open:e,onClose:t}){let{t:n}=f(),r=I(),{connect:i}=h(),[a,o]=(0,G.useState)(``);(0,G.useEffect)(()=>{e&&o(``)},[e]);let s=async()=>{try{let e=await i.mutateAsync({accessToken:a.trim()});r.success(n(`Connected to {name}`,{name:e.merchantName??`Loyverse`}),n(`{stores} stores · {types} payment types`,{stores:e.stores.length,types:e.paymentTypes.length})),t()}catch(e){r.error(n(`Could not connect`),L(e))}},c=a.trim().length>=10;return(0,K.jsx)(R,{open:e,onClose:t,title:n(`Connect Loyverse`),description:n(`A personal access token gives ledgr read access to this Loyverse account.`),width:480,footer:(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(F,{variant:`ghost`,size:`md`,onClick:t,children:n(`Cancel`)}),(0,K.jsx)(F,{variant:`primary`,size:`md`,onClick:s,loading:i.isPending,disabled:!c,children:n(`Connect`)})]}),children:(0,K.jsxs)(`form`,{className:`space-y-4`,onSubmit:e=>{e.preventDefault(),c&&s()},children:[(0,K.jsx)(j,{label:n(`Access token`),required:!0,hint:(0,K.jsxs)(`a`,{className:`inline-flex items-center gap-1 text-accent`,href:q,target:`_blank`,rel:`noreferrer`,children:[n(`Back Office → Integrations → Access tokens`),` `,(0,K.jsx)(U,{className:`size-3`})]}),children:(0,K.jsx)(k,{mono:!0,autoFocus:!0,value:a,onChange:e=>o(e.target.value),placeholder:`fMYgxHEYtcyT8cvtvgi1Za5DRs4vArSy…`,autoComplete:`off`,spellCheck:!1})}),(0,K.jsx)(`p`,{className:`text-[12.5px] text-ink-3`,children:n(`The token is stored in this project’s database only. Its currency must match the project currency.`)})]})})}function Z({i:e,onReconnect:t}){let{t:n,name:r}=f(),{locale:a}=v(),s=I(),{syncItems:c,disconnect:d,settings:p}=h(),g=m(`revenue`),y=_(!0),[b,x]=(0,G.useState)(!1),[S,C]=(0,G.useState)(!1),[T,E]=(0,G.useState)(e.settings.storeIds),[k,N]=(0,G.useState)(e.settings.paymentTypeIds),[R,B]=(0,G.useState)(e.settings.methodMap),[H,U]=(0,G.useState)(e.settings.categoryId??``),[W,q]=(0,G.useState)(e.settings.subtractPayouts??!0);(0,G.useEffect)(()=>{E(e.settings.storeIds),N(e.settings.paymentTypeIds),B(e.settings.methodMap),U(e.settings.categoryId??``),q(e.settings.subtractPayouts??!0)},[e.settings]);let J=k.length?k:e.paymentTypes.filter(o).map(e=>e.id),X=JSON.stringify({storeIds:T,typeIds:k,methodMap:R,categoryId:H,subtractPayouts:W})!==JSON.stringify({storeIds:e.settings.storeIds,typeIds:e.settings.paymentTypeIds,methodMap:e.settings.methodMap,categoryId:e.settings.categoryId??``,subtractPayouts:e.settings.subtractPayouts??!0}),Z=async()=>{try{await p.mutateAsync({storeIds:T,paymentTypeIds:J,methodMap:R,categoryId:H||null,subtractPayouts:W}),s.success(n(`Integration settings saved`))}catch(e){s.error(n(`Could not save`),L(e))}},$=(e,t)=>e.includes(t)?e.filter(e=>e!==t):[...e,t],ie=(y.data?.items??[]).filter(e=>!e.archived);return(0,K.jsxs)(`div`,{className:`space-y-4`,children:[e.lastError&&(0,K.jsxs)(`div`,{className:`card px-4 py-3 flex items-start gap-3 border-warning/40`,children:[(0,K.jsx)(P,{className:`size-5 text-warning shrink-0 mt-0.5`}),(0,K.jsxs)(`div`,{className:`min-w-0 text-[13.5px]`,children:[(0,K.jsx)(`span`,{className:`font-medium`,children:n(`Last Loyverse call failed`)}),(0,K.jsx)(`div`,{className:`text-ink-3 break-words`,children:e.lastError})]})]}),(0,K.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-4`,children:[(0,K.jsx)(u,{className:`xl:col-span-2`,children:(0,K.jsxs)(`div`,{className:`flex items-start gap-4 py-1`,children:[(0,K.jsx)(Y,{}),(0,K.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,K.jsx)(`h3`,{className:`text-[17px] font-semibold tracking-tight truncate`,children:e.merchantName??`Loyverse`}),(0,K.jsxs)(l,{tone:`good`,children:[(0,K.jsx)(z,{className:`size-3`}),` `,n(`Connected`)]}),e.currency&&(0,K.jsx)(l,{children:e.currency})]}),(0,K.jsxs)(`dl`,{className:`mt-2 grid grid-cols-2 sm:grid-cols-4 gap-x-4 gap-y-1 text-[12.5px]`,children:[(0,K.jsx)(Q,{label:n(`Stores`),value:String(e.stores.length)}),(0,K.jsx)(Q,{label:n(`Items`),value:String(e.itemCount),sub:e.lastItemsSyncAt?n(`synced {when}`,{when:V(e.lastItemsSyncAt,a)}):n(`not synced yet`)}),(0,K.jsx)(Q,{label:n(`Categories`),value:String(e.categoryCount)}),(0,K.jsx)(Q,{label:n(`Shifts pulled`),value:String(e.shiftCount),sub:e.lastShiftPullAt?n(`last {when}`,{when:V(e.lastShiftPullAt,a)}):void 0})]}),(0,K.jsxs)(`div`,{className:`mt-4 flex flex-wrap gap-2`,children:[(0,K.jsx)(F,{variant:`primary`,icon:(0,K.jsx)(ee,{className:i(`size-4`,c.isPending&&`animate-spin`)}),loading:c.isPending,onClick:async()=>{try{let e=await c.mutateAsync();s.success(n(`Items synced`),n(`{items} items · {categories} categories{removed}`,{items:e.items,categories:e.categories,removed:e.removed?` · ${n(`{n} removed`,{n:e.removed})}`:``}))}catch(e){s.error(n(`Sync failed`),L(e))}},children:n(`Sync items`)}),(0,K.jsx)(F,{variant:`secondary`,icon:(0,K.jsx)(w,{className:`size-4`}),onClick:()=>C(!0),children:n(`Pull last shift`)}),(0,K.jsx)(F,{variant:`ghost`,onClick:t,children:n(`Replace token`)}),(0,K.jsx)(F,{variant:`ghost`,className:`text-critical`,icon:(0,K.jsx)(ne,{className:`size-4`}),onClick:()=>x(!0),children:n(`Disconnect`)})]})]})]})}),(0,K.jsx)(u,{title:n(`Shift pulls`),subtitle:n(`What goes on the revenue row`),actions:X?(0,K.jsx)(F,{size:`xs`,variant:`primary`,loading:p.isPending,onClick:Z,children:n(`Save`)}):void 0,children:(0,K.jsxs)(`div`,{className:`space-y-4`,children:[(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`div`,{className:`label mb-1.5`,children:n(`Payment types to pull`)}),(0,K.jsxs)(`ul`,{className:`space-y-1.5`,children:[e.paymentTypes.map(e=>(0,K.jsxs)(`li`,{className:`flex items-center gap-2`,children:[(0,K.jsx)(A,{label:(0,K.jsxs)(`span`,{dir:`auto`,children:[e.name,` `,(0,K.jsx)(`span`,{className:`text-ink-3 text-[12px]`,children:o(e)?n(`cash`):e.type===`NONINTEGRATEDCARD`?n(`card`):e.type.toLowerCase()})]}),checked:J.includes(e.id),onChange:()=>N($(J,e.id))}),J.includes(e.id)&&(0,K.jsxs)(O,{compact:!0,className:`ms-auto w-[150px]`,value:R[e.id]??``,onChange:t=>B(()=>{let n={...R};return t.target.value?n[e.id]=t.target.value:delete n[e.id],n}),title:n(`ledgr payment method`),children:[(0,K.jsx)(`option`,{value:``,children:n(`→ “{name}” (auto)`,{name:o(e)?n(`Cash`):e.name})}),ie.map(e=>(0,K.jsxs)(`option`,{value:e.id,children:[`→ `,r(e)]},e.id))]})]},e.id)),!e.paymentTypes.length&&(0,K.jsx)(`li`,{className:`text-[13px] text-ink-3`,children:n(`No payment types found in Loyverse.`)})]}),(0,K.jsx)(`p`,{className:`text-[12px] text-ink-3 mt-1.5`,children:n(`Cash-like types are summed into one Cash amount. Unticked types stay in Loyverse (shown on the shift, not added to the ledger).`)})]}),e.stores.length>1&&(0,K.jsxs)(`div`,{children:[(0,K.jsx)(`div`,{className:`label mb-1.5`,children:n(`Stores`)}),(0,K.jsx)(`ul`,{className:`space-y-1.5`,children:e.stores.map(t=>(0,K.jsx)(`li`,{children:(0,K.jsx)(A,{label:t.name,checked:!T.length||T.includes(t.id),onChange:()=>E(T.length?$(T,t.id):e.stores.filter(e=>e.id!==t.id).map(e=>e.id))})},t.id))})]}),(0,K.jsx)(M,{checked:W,onChange:q,label:n(`Subtract cash pay-outs`),description:n(`Money taken out of the drawer during the shift (supplies, petty cash) comes off the cash amount.`)}),(0,K.jsx)(j,{label:n(`Revenue category`),hint:n(`for the shift rows`),children:(0,K.jsxs)(O,{value:H,onChange:e=>U(e.target.value),children:[(0,K.jsx)(`option`,{value:``,children:n(`Default category`)}),(g.data?.items??[]).filter(e=>!e.archived).map(e=>(0,K.jsx)(`option`,{value:e.id,children:r(e)},e.id))]})})]})})]}),(0,K.jsx)(re,{i:e}),(0,K.jsx)(D,{open:S,onClose:()=>C(!1)}),(0,K.jsx)(te,{open:b,onClose:()=>x(!1),loading:d.isPending,title:n(`Disconnect Loyverse?`),description:n(`The token and the cached catalogue are removed. Revenue rows already pulled stay in the ledger.`),onConfirm:async()=>{try{await d.mutateAsync(),x(!1),s.success(n(`Loyverse disconnected`))}catch(e){s.error(n(`Failed`),L(e))}}})]})}function Q({label:e,value:t,sub:n}){return(0,K.jsxs)(`div`,{className:`min-w-0`,children:[(0,K.jsx)(`dt`,{className:`text-ink-3`,children:e}),(0,K.jsxs)(`dd`,{className:`num text-[15px] font-semibold text-ink`,children:[t,n&&(0,K.jsx)(`span`,{className:`block num text-[11.5px] font-normal text-ink-3 truncate`,children:n})]})]})}function re({i:e}){let{t}=f(),{money:n}=v(),r=N(),[o,s]=(0,G.useState)(``),[c,l]=(0,G.useState)(``),[p,m]=(0,G.useState)(``);(0,G.useEffect)(()=>{let e=setTimeout(()=>m(o.trim()),200);return()=>clearTimeout(e)},[o]);let h=g((0,G.useMemo)(()=>({q:p||void 0,categoryId:c||void 0}),[p,c])),_=h.data?.items??[],w=h.data?.categories.filter(e=>!e.deletedAt)??[];return!e.itemCount&&!h.data?.total&&!p&&!c?(0,K.jsx)(u,{flush:!0,children:(0,K.jsx)(d,{icon:(0,K.jsx)(E,{}),title:t(`No items yet`),description:t(`Sync items to see the Loyverse catalogue here with its categories, prices and costs.`)})}):(0,K.jsx)(u,{title:t(`Items`),subtitle:h.data?t(`{n} items in {c} categories`,{n:h.data.total,c:w.length}):void 0,flush:!0,actions:(0,K.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,K.jsxs)(O,{compact:!0,value:c,onChange:e=>l(e.target.value),className:`w-[150px]`,children:[(0,K.jsx)(`option`,{value:``,children:t(`All categories`)}),w.map(e=>(0,K.jsxs)(`option`,{value:e.id,children:[e.name,` (`,e.itemCount,`)`]},e.id)),(0,K.jsx)(`option`,{value:`none`,children:t(`Uncategorised`)})]}),(0,K.jsxs)(`div`,{className:`relative`,children:[(0,K.jsx)(T,{className:`size-4 absolute start-2.5 top-1/2 -translate-y-1/2 text-ink-3 pointer-events-none`}),(0,K.jsx)(k,{compact:!0,value:o,onChange:e=>s(e.target.value),placeholder:t(`Search items`),className:`ps-8 w-[160px] md:w-[220px]`})]})]}),children:r?(0,K.jsxs)(`ul`,{className:`divide-y divide-line`,children:[_.map(e=>(0,K.jsxs)(`li`,{className:`px-4 py-3 flex items-center gap-3`,children:[(0,K.jsx)(a,{color:$(e.category?.color),size:10}),(0,K.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,K.jsx)(`div`,{dir:`auto`,className:`text-[14.5px] font-medium truncate`,children:e.name}),(0,K.jsxs)(`div`,{className:`text-[12.5px] text-ink-3 truncate`,children:[e.category?.name??t(`Uncategorised`),e.sku?` · ${e.sku}`:``,e.variantCount>1?` · ${t(`{n} variants`,{n:e.variantCount})}`:``]})]}),(0,K.jsx)(`div`,{className:`text-end num text-[14px]`,children:e.priceMinor===null?(0,K.jsx)(`span`,{className:`text-ink-4`,children:`—`}):n(e.priceMinor)})]},e.id)),!_.length&&(0,K.jsx)(`li`,{className:`px-4 py-8 text-center text-[13px] text-ink-3`,children:t(`No items match.`)})]}):(0,K.jsxs)(S,{children:[(0,K.jsx)(`thead`,{children:(0,K.jsxs)(`tr`,{children:[(0,K.jsx)(y,{children:t(`Item`)}),(0,K.jsx)(y,{children:t(`Category`)}),(0,K.jsx)(y,{children:t(`SKU`)}),(0,K.jsx)(y,{align:`right`,children:t(`Price`)}),(0,K.jsx)(y,{align:`right`,children:t(`Cost`)}),(0,K.jsx)(y,{align:`right`,children:t(`Margin`)})]})}),(0,K.jsxs)(`tbody`,{children:[h.isPending&&(0,K.jsx)(C,{colSpan:6,children:t(`Loading…`)}),!h.isPending&&!_.length&&(0,K.jsx)(C,{colSpan:6,children:t(`No items match.`)}),_.map(e=>{let r=e.priceMinor&&e.costMinor!==null?(e.priceMinor-e.costMinor)/e.priceMinor*100:null;return(0,K.jsxs)(x,{children:[(0,K.jsxs)(b,{children:[(0,K.jsx)(`div`,{dir:`auto`,className:`font-medium truncate max-w-[360px]`,children:e.name}),e.variantCount>1&&(0,K.jsx)(`div`,{className:`text-[12px] text-ink-3`,children:t(`{n} variants`,{n:e.variantCount})})]}),(0,K.jsx)(b,{children:e.category?(0,K.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 text-[13px] text-ink-2`,children:[(0,K.jsx)(a,{color:$(e.category.color)}),e.category.name]}):(0,K.jsx)(`span`,{className:`text-ink-4`,children:`—`})}),(0,K.jsx)(b,{className:`mono text-[12.5px] text-ink-2`,children:e.sku??(0,K.jsx)(`span`,{className:`text-ink-4`,children:`—`})}),(0,K.jsx)(b,{align:`right`,className:`num`,children:e.priceMinor===null?(0,K.jsx)(`span`,{className:`text-ink-4`,children:`—`}):n(e.priceMinor)}),(0,K.jsx)(b,{align:`right`,className:`num text-ink-2`,children:e.costMinor===null?(0,K.jsx)(`span`,{className:`text-ink-4`,children:`—`}):n(e.costMinor)}),(0,K.jsx)(b,{align:`right`,className:i(`num`,r!==null&&r<0&&`text-critical`),children:r===null?(0,K.jsx)(`span`,{className:`text-ink-4`,children:`—`}):`${Math.round(r)}%`})]},e.id)})]})]})})}function $(e){return e&&{GREY:`#9aa0ab`,RED:`#e5484d`,PINK:`#e93d82`,ORANGE:`#f76b15`,YELLOW:`#f5b400`,GREEN:`#30a46c`,BLUE:`#3e63dd`,PURPLE:`#8e4ec6`}[e.toUpperCase()]||`var(--s-other)`}export{J as IntegrationsPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_t as e,ft as t,g as n,h as r,mt as i,v as a}from"./badge-DCLlsDNI.js";import{C as o,l as s}from"./queries-CxLQqNqz.js";import{n as c}from"./project-CYHaWZqH.js";import{t as l}from"./download-gNHw92Vi.js";import{n as u,t as d}from"./menu-C-8r2BNA.js";import{t as f}from"./search-CnrmI1BH.js";import{a as p,c as m,i as h,r as g}from"./media-D6XgVZ7M.js";import{t as _}from"./money-input-DQaEauAw.js";import{f as v,h as y,k as b,m as x,u as S}from"./index-B9WjaP25.js";var C={name:`file-spreadsheet`,size:24,node:[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M8 13h2`,key:`yr2amv`}],[`path`,{d:`M14 13h2`,key:`un5t4a`}],[`path`,{d:`M8 17h2`,key:`2yhykz`}],[`path`,{d:`M14 17h2`,key:`10kma7`}]]};C.node;var w=n(C),T={name:`file-text`,size:24,node:[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]]};T.node;var E=n(T),D={name:`sliders-horizontal`,size:24,node:[[`path`,{d:`M10 5H3`,key:`1qgfaw`}],[`path`,{d:`M12 19H3`,key:`yhmn1j`}],[`path`,{d:`M14 3v4`,key:`1sua03`}],[`path`,{d:`M16 17v4`,key:`1q0r14`}],[`path`,{d:`M21 12h-9`,key:`1o4lsq`}],[`path`,{d:`M21 19h-5`,key:`1rlt1p`}],[`path`,{d:`M21 5h-7`,key:`1oszz2`}],[`path`,{d:`M8 10v4`,key:`tgpxqk`}],[`path`,{d:`M8 12H3`,key:`a7s4jb`}]]};D.node;var O=n(D),k={name:`square-check-big`,size:24,node:[[`path`,{d:`M21 10.656V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.344`,key:`2acyp4`}],[`path`,{d:`m9 11 3 3L22 4`,key:`1pflzl`}]],aliases:[`check-square`]};k.node;var A=n(k),j={name:`square`,size:24,node:[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}]]};j.node;var M=n(j),N=e(i(),1),P=t();function F({target:e,onClose:t}){let{t:n,name:r}=a(),{money:i}=c(),l=o(),u=s(),d=y(),[f,p]=(0,N.useState)(null),m=e?.entry.payments.find(t=>t.paymentMethodId===e.method.id)?.amountMinor??null;if((0,N.useEffect)(()=>p(m),[m,e]),!e)return null;let{entry:h,method:b}=e,C=e.kind===`revenue`?l.setPayment:u.setPayment,w=h.payments.filter(e=>e.paymentMethodId!==b.id).reduce((e,t)=>e+t.amountMinor,0)+(f??0),T=async()=>{try{await C.mutateAsync({id:h.id,paymentMethodId:b.id,amountMinor:f??0}),d.success(n(f?`{method} amount saved`:`{method} amount removed`,{method:r(b)})),t()}catch(e){d.error(n(`Could not save`),x(e))}};return(0,P.jsx)(S,{open:!0,onClose:t,title:n(m?`Edit {method} amount`:`Add {method} amount`,{method:r(b)}),description:h.description,footer:(0,P.jsxs)(P.Fragment,{children:[m!==null&&(0,P.jsx)(v,{variant:`danger`,size:`md`,onClick:()=>p(0),disabled:f===0,children:n(`Clear`)}),(0,P.jsx)(v,{variant:`ghost`,size:`md`,onClick:t,children:n(`Cancel`)}),(0,P.jsx)(v,{variant:`primary`,size:`md`,onClick:T,loading:C.isPending,disabled:f===null||f<0||w<=0,children:n(`Save`)})]}),children:(0,P.jsxs)(`form`,{className:`space-y-3`,onSubmit:e=>{e.preventDefault(),T()},children:[(0,P.jsx)(g,{label:n(`{method} amount`,{method:r(b)}),children:(0,P.jsx)(_,{large:!0,value:f,onChange:p,autoFocus:!0})}),(0,P.jsxs)(`div`,{className:`flex items-center justify-between text-[13px] text-ink-3`,children:[(0,P.jsx)(`span`,{children:n(`New total`)}),(0,P.jsx)(`span`,{className:`num font-semibold text-ink`,children:i(w)})]})]})})}function I(){let[e,t]=b();return{q:e.get(`q`)??``,categoryId:e.get(`categoryId`)??``,stakeholderId:e.get(`stakeholderId`)??``,paymentMethodId:e.get(`paymentMethodId`)??``,sort:e.get(`sort`)??`date`,order:e.get(`order`)??`desc`,page:Number(e.get(`page`)??`1`)||1,set:e=>t(t=>{let n=new URLSearchParams(t);for(let[t,r]of Object.entries(e))r?n.set(t,r):n.delete(t);return`page`in e||n.delete(`page`),n},{replace:!0})}}function L({categories:e,stakeholders:t,stakeholderLabel:n=`Paid by`,paymentMethods:i,onExport:o,extra:s}){let{t:c,name:g}=a(),_=I(),y=[_.categoryId,_.stakeholderId,i?_.paymentMethodId:``].filter(Boolean).length,[b,x]=(0,N.useState)(y>0);return(0,P.jsxs)(`div`,{className:`space-y-2`,children:[(0,P.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,P.jsxs)(`div`,{className:`relative flex-1 md:max-w-[320px]`,children:[(0,P.jsx)(f,{className:`absolute start-3 top-1/2 -translate-y-1/2 size-4 text-ink-3`}),(0,P.jsx)(h,{compact:!0,className:`ps-9 h-10 md:h-9 rounded-full`,placeholder:c(`Search`),value:_.q,onChange:e=>_.set({q:e.target.value||null})}),_.q&&(0,P.jsx)(`button`,{type:`button`,"aria-label":c(`Clear search`),onClick:()=>_.set({q:null}),className:`absolute end-2 top-1/2 -translate-y-1/2 size-6 inline-flex items-center justify-center rounded-full text-ink-3 hover:bg-card-hover`,children:(0,P.jsx)(m,{className:`size-3.5`})})]}),(0,P.jsxs)(`button`,{type:`button`,onClick:()=>x(e=>!e),className:r(`h-10 md:h-9 px-3 inline-flex items-center gap-1.5 rounded-full border text-[13.5px] font-medium`,b||y?`bg-primary text-primary-ink border-primary`:`bg-card border-line text-ink-2 hover:text-ink`),children:[(0,P.jsx)(O,{className:`size-4`}),` `,(0,P.jsx)(`span`,{className:`hidden sm:inline`,children:c(`Filters`)}),y>0&&(0,P.jsx)(`span`,{className:`num text-[12px] opacity-80`,children:y})]}),(0,P.jsx)(`div`,{className:`flex-1 hidden md:block`}),s,o&&(0,P.jsx)(d,{align:`right`,className:`max-md:hidden`,trigger:()=>(0,P.jsx)(v,{size:`sm`,variant:`secondary`,className:`rounded-full`,icon:(0,P.jsx)(l,{className:`size-4`}),children:c(`Export`)}),children:e=>(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(u,{icon:(0,P.jsx)(w,{}),onClick:()=>{e(),o(`xlsx`)},children:c(`Excel (.xlsx), with dropdowns`)}),(0,P.jsx)(u,{icon:(0,P.jsx)(E,{}),onClick:()=>{e(),o(`csv`)},children:c(`CSV`)})]})})]}),b&&(0,P.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap fade-up`,children:[(0,P.jsxs)(p,{compact:!0,className:`w-[180px]`,value:_.categoryId,onChange:e=>_.set({categoryId:e.target.value||null}),children:[(0,P.jsx)(`option`,{value:``,children:c(`All categories`)}),e.map(e=>(0,P.jsx)(`option`,{value:e.id,children:g(e)},e.id))]}),(0,P.jsxs)(p,{compact:!0,className:`w-[180px]`,value:_.stakeholderId,onChange:e=>_.set({stakeholderId:e.target.value||null}),children:[(0,P.jsx)(`option`,{value:``,children:c(`{label}: anyone`,{label:c(n)})}),t.map(e=>(0,P.jsx)(`option`,{value:e.id,children:g(e)},e.id))]}),i&&(0,P.jsxs)(p,{compact:!0,className:`w-[180px]`,value:_.paymentMethodId,onChange:e=>_.set({paymentMethodId:e.target.value||null}),children:[(0,P.jsx)(`option`,{value:``,children:c(`All payment methods`)}),i.map(e=>(0,P.jsx)(`option`,{value:e.id,children:g(e)},e.id))]}),y>0&&(0,P.jsx)(v,{size:`xs`,variant:`ghost`,icon:(0,P.jsx)(m,{className:`size-3.5`}),onClick:()=>_.set({categoryId:null,stakeholderId:null,paymentMethodId:null}),children:c(`Clear`)}),o&&(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(v,{size:`xs`,variant:`ghost`,className:`md:hidden`,icon:(0,P.jsx)(l,{className:`size-3.5`}),onClick:()=>o(`xlsx`),children:c(`Excel`)}),(0,P.jsx)(v,{size:`xs`,variant:`ghost`,className:`md:hidden`,onClick:()=>o(`csv`),children:c(`CSV`)})]})]})]})}export{A as a,M as i,I as n,F as r,L as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_t as e,ft as t,g as n,h as r,mt as i}from"./badge-DCLlsDNI.js";var a={name:`x`,size:24,node:[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]};a.node;var o=n(a),s=e(i(),1),c=t(),l=`w-full bg-card border border-line-strong rounded-[12px] px-3.5 text-ink placeholder:text-ink-3 hover:border-ink-4 focus:border-accent focus:outline-none focus:ring-4 focus:ring-accent/15 transition-colors disabled:opacity-50`,u=(0,s.forwardRef)(function({className:e,mono:t,compact:n,...i},a){return(0,c.jsx)(`input`,{ref:a,className:r(l,n?`h-9 rounded-[10px] text-[13.5px]`:`h-11 md:h-10`,t&&`num`,e),...i})}),d=(0,s.forwardRef)(function({className:e,...t},n){return(0,c.jsx)(`textarea`,{ref:n,className:r(l,`py-2.5 min-h-[76px] resize-y`,e),...t})}),f=(0,s.forwardRef)(function({className:e,children:t,compact:n,...i},a){return(0,c.jsxs)(`div`,{className:`relative`,children:[(0,c.jsx)(`select`,{ref:a,className:r(l,`appearance-none pe-9`,n?`h-9 rounded-[10px] text-[13.5px]`:`h-11 md:h-10`,e),...i,children:t}),(0,c.jsx)(`svg`,{className:`pointer-events-none absolute end-3 top-1/2 -translate-y-1/2 size-4 text-ink-3`,viewBox:`0 0 16 16`,fill:`none`,"aria-hidden":!0,children:(0,c.jsx)(`path`,{d:`M4 6l4 4 4-4`,stroke:`currentColor`,strokeWidth:`1.6`,strokeLinecap:`round`,strokeLinejoin:`round`})})]})});function p({label:e,hint:t,error:n,children:i,className:a,required:o}){return(0,c.jsxs)(`label`,{className:r(`block`,a),children:[(0,c.jsxs)(`span`,{className:`mb-1.5 flex items-baseline justify-between gap-2`,children:[(0,c.jsxs)(`span`,{className:`text-[13px] font-medium text-ink-2`,children:[e,o&&(0,c.jsx)(`span`,{className:`text-critical ms-0.5`,children:`*`})]}),t&&(0,c.jsx)(`span`,{className:`text-[12px] text-ink-3`,children:t})]}),i,n&&(0,c.jsx)(`span`,{className:`mt-1.5 block text-[12.5px] text-critical`,children:n})]})}function m({label:e,className:t,...n}){return(0,c.jsxs)(`label`,{className:r(`inline-flex items-center gap-2.5 cursor-pointer text-[14px] text-ink-2 select-none min-h-[32px]`,t),children:[(0,c.jsx)(`input`,{type:`checkbox`,className:`size-[18px] rounded-[5px] border border-line-strong accent-[var(--accent)]`,...n}),e]})}function h({checked:e,onChange:t,label:n,disabled:i,description:a}){return(0,c.jsxs)(`button`,{type:`button`,role:`switch`,"aria-checked":e,disabled:i,onClick:()=>t(!e),className:`w-full flex items-center justify-between gap-3 text-start text-[14px] text-ink disabled:opacity-50 min-h-[40px]`,children:[(0,c.jsxs)(`span`,{children:[(0,c.jsx)(`span`,{className:`block font-medium`,children:n}),a&&(0,c.jsx)(`span`,{className:`block text-[12.5px] text-ink-3`,children:a})]}),(0,c.jsx)(`span`,{className:r(`relative inline-block h-[26px] w-[44px] shrink-0 rounded-full transition-colors`,e?`bg-accent`:`bg-line-strong`),children:(0,c.jsx)(`span`,{className:r(`absolute top-[3px] size-5 rounded-full bg-white shadow transition-transform`,e?`translate-x-[21px]`:`translate-x-[3px]`)})})]})}function g(e){let[t,n]=(0,s.useState)(()=>typeof window<`u`&&window.matchMedia(e).matches);return(0,s.useEffect)(()=>{let t=window.matchMedia(e),r=()=>n(t.matches);return r(),t.addEventListener(`change`,r),()=>t.removeEventListener(`change`,r)},[e]),t}var _=()=>g(`(max-width: 767px)`);export{f as a,o as c,u as i,m as n,d as o,p as r,h as s,_ as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_t as e,ft as t,g as n,h as r,mt as i,pt as a}from"./badge-DCLlsDNI.js";import{t as o}from"./media-D6XgVZ7M.js";import{E as s,T as c}from"./index-B9WjaP25.js";var l={name:`ellipsis`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`1`,key:`41hilf`}],[`circle`,{cx:`19`,cy:`12`,r:`1`,key:`1wjl8i`}],[`circle`,{cx:`5`,cy:`12`,r:`1`,key:`1pcz8c`}]],aliases:[`more-horizontal`]};l.node;var u=n(l),d={name:`pencil`,size:24,node:[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]};d.node;var f=n(d),p={name:`trash`,size:24,node:[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]],aliases:[`trash-2`]};p.node;var m=n(p),h=e(i(),1),g=a(),_=t();function v({trigger:e,children:t,align:n=`right`,className:i,title:a}){let[l,u]=(0,h.useState)(!1),[d,f]=(0,h.useState)(null),p=(0,h.useRef)(null),m=(0,h.useRef)(null),v=o();(0,h.useLayoutEffect)(()=>{if(!l||v)return;let e=()=>{let e=p.current?.getBoundingClientRect();if(!e)return;let t=m.current?.offsetHeight??200,r=e.bottom+t+12>window.innerHeight&&e.top>t+12;f({top:r?e.top-6:e.bottom+6,...n===`right`?{right:Math.max(8,window.innerWidth-e.right)}:{left:Math.max(8,e.left)},up:r})};return e(),window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),()=>{window.removeEventListener(`resize`,e),window.removeEventListener(`scroll`,e,!0)}},[l,v,n]),(0,h.useEffect)(()=>{if(!l)return;let e=e=>{let t=e.target;!p.current?.contains(t)&&!m.current?.contains(t)&&u(!1)},t=e=>e.key===`Escape`&&u(!1);return v||document.addEventListener(`mousedown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`keydown`,t)}},[l,v]);let y=()=>u(!1),b=typeof t==`function`?t(y):t;return(0,_.jsxs)(`div`,{ref:p,className:r(`relative inline-block`,i),children:[(0,_.jsx)(`div`,{onClick:()=>u(e=>!e),children:e(l)}),(0,g.createPortal)((0,_.jsx)(s,{children:l&&(v?(0,_.jsxs)(`div`,{className:`fixed inset-0 z-50 flex items-end`,role:`menu`,children:[(0,_.jsx)(c.div,{className:`absolute inset-0 bg-black/40`,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},onClick:y}),(0,_.jsxs)(c.div,{ref:m,className:`relative w-full bg-card rounded-t-[24px] p-2 pb-[max(8px,var(--safe-bottom))] shadow-2xl`,initial:{y:`100%`},animate:{y:0},exit:{y:`100%`},transition:{type:`spring`,stiffness:420,damping:40},children:[(0,_.jsx)(`div`,{className:`mx-auto mt-1 mb-2 h-1.5 w-10 rounded-full bg-line-strong`}),a&&(0,_.jsx)(`div`,{className:`px-3 pb-2 text-[13px] text-ink-3 font-medium`,children:a}),b]})]}):(0,_.jsx)(`div`,{ref:m,style:{position:`fixed`,top:d?.top??0,left:d?.left,right:d?.right,transform:d?.up?`translateY(-100%)`:void 0,zIndex:60,visibility:d?`visible`:`hidden`},className:`min-w-[200px] card p-1.5 shadow-[var(--shadow-pop)]`,role:`menu`,children:b}))}),document.body)]})}function y({children:e,onClick:t,danger:n,icon:i,disabled:a}){return(0,_.jsxs)(`button`,{type:`button`,role:`menuitem`,disabled:a,onClick:t,className:r(`w-full flex items-center gap-3 h-11 md:h-9 px-3 rounded-[10px] text-start text-[15px] md:text-[13.5px] hover:bg-card-hover disabled:opacity-40 disabled:pointer-events-none`,n?`text-critical`:`text-ink`),children:[i&&(0,_.jsx)(`span`,{className:`text-ink-3 [&>svg]:size-[18px] md:[&>svg]:size-4`,children:i}),e]})}function b(){return(0,_.jsx)(`div`,{className:`my-1 h-px bg-line`})}export{f as a,m as i,y as n,u as o,b as r,v as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ft as e,h as t}from"./badge-DCLlsDNI.js";import{n}from"./project-CYHaWZqH.js";var r=e();function i({minor:e,className:i,tone:a=`neutral`,signed:o,compact:s,muted:c}){let{money:l}=n(),u={signed:o,compact:s};return(0,r.jsx)(`span`,{className:t(`num`,a===`flow`?e>0?`text-good`:e<0?`text-critical`:`text-ink-3`:a===`expense`?`text-expense`:a===`revenue`?`text-revenue`:c?`text-ink-3`:``,i),title:l(e),children:l(e,u)})}export{i as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{N as e,_t as t,ft as n,mt as r}from"./badge-DCLlsDNI.js";import{n as i}from"./project-CYHaWZqH.js";import{i as a}from"./media-D6XgVZ7M.js";var o=t(r(),1),s=n(),c=(0,o.forwardRef)(function({value:t,onChange:n,large:r,className:c,...l},u){let{currency:d,toMajor:f,digits:p}=i(),[m,h]=(0,o.useState)(t===null?``:f(t).toFixed(p));return(0,o.useEffect)(()=>{e(m,d)!==t&&h(t===null?``:f(t).toFixed(p))},[t]),(0,s.jsxs)(`div`,{className:`relative`,dir:`ltr`,children:[(0,s.jsx)(`span`,{className:`absolute start-3.5 top-1/2 -translate-y-1/2 text-ink-3 font-medium pointer-events-none ${r?`text-[16px]`:`text-[13px]`}`,children:d}),(0,s.jsx)(a,{ref:u,mono:!0,inputMode:`decimal`,className:`${r?`ps-16 h-14 text-[26px] font-semibold rounded-[14px]`:`ps-14`} text-end ${c??``}`,value:m,placeholder:`0.00`,onChange:t=>{h(t.target.value),n(e(t.target.value,d))},onBlur:()=>{let t=e(m,d);t!==null&&h(f(t).toFixed(p))},...l})]})});export{c as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ft as e,h as t,i as n,l as r,o as i,s as a,t as o,u as s,v as c}from"./badge-DCLlsDNI.js";import{g as l}from"./queries-CxLQqNqz.js";import{n as u}from"./project-CYHaWZqH.js";import{a as d,c as f,f as p,h as m,l as h,m as g,n as _,o as v,p as y,r as b,s as x,t as S,u as C}from"./tooltip-CYNpGhCZ.js";import{C as w,O as T,f as E,p as D}from"./index-B9WjaP25.js";import{r as O,t as k}from"./format-GDcQVAp4.js";import{t as A}from"./money-OFUBQ3gl.js";import{t as j}from"./breakdown-B7xclB2-.js";var M=e(),N=[{key:`revenueMinor`,label:`Revenue`,color:`var(--s-revenue)`,kind:`bar`},{key:`expenseMinor`,label:`Expenses`,color:`var(--s-expense)`,kind:`bar`},{key:`netMinor`,label:`Net`,color:`var(--s-net)`,kind:`line`}];function P({series:e,granularity:t}){let{t:n}=c(),{money:r,date:i,toMajor:a,currency:o,locale:s}=u(),l=e=>new Intl.NumberFormat(s,{notation:`compact`,maximumFractionDigits:1}).format(a(e)),m=e=>t===`month`?new Intl.DateTimeFormat(s,{month:`short`,year:`2-digit`,timeZone:`UTC`}).format(new Date(`${e}T00:00:00Z`)):i(e,`short`),g=e.map(e=>({...e,label:m(e.bucket)}));return(0,M.jsxs)(`div`,{className:`h-full flex flex-col`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between pt-1 pb-2`,children:[(0,M.jsx)(_,{items:N.map(e=>({label:n(e.label),color:e.color,kind:e.kind}))}),(0,M.jsxs)(`span`,{className:`label`,children:[o,` · `,n(`by {granularity}`,{granularity:n(t)})]})]}),(0,M.jsx)(`div`,{className:`flex-1 min-h-[220px] -ms-3`,children:(0,M.jsx)(p,{width:`100%`,height:`100%`,children:(0,M.jsxs)(b,{data:g,margin:{top:16,right:12,bottom:0,left:0},barGap:2,barCategoryGap:`28%`,children:[(0,M.jsx)(h,{vertical:!1,stroke:`var(--line)`,strokeWidth:1}),(0,M.jsx)(v,{dataKey:`label`,tickLine:!1,axisLine:{stroke:`var(--line)`},tick:{fill:`var(--ink-3)`,fontSize:11},interval:`preserveStartEnd`,minTickGap:28}),(0,M.jsx)(d,{tickLine:!1,axisLine:!1,tickFormatter:l,width:48,tick:{fill:`var(--ink-3)`,fontSize:11}}),(0,M.jsx)(C,{cursor:{fill:`var(--card-hover)`,opacity:.8},content:({active:e,payload:a})=>{if(!e||!a?.length)return null;let o=a[0].payload;return(0,M.jsx)(S,{title:t===`day`?i(o.bucket,`long`):t===`week`?n(`Week of {date}`,{date:i(o.bucket)}):m(o.bucket),rows:[{label:n(`Revenue`),value:r(o.revenueMinor),color:`var(--s-revenue)`},{label:n(`Expenses`),value:r(o.expenseMinor),color:`var(--s-expense)`},{label:n(`Net`),value:r(o.netMinor,{signed:!0}),color:`var(--s-net)`},{label:n(`Cumulative`),value:r(o.cumulativeNetMinor,{signed:!0})}]})}}),(0,M.jsx)(x,{dataKey:`revenueMinor`,fill:`var(--s-revenue)`,radius:[4,4,0,0],maxBarSize:24,isAnimationActive:!1}),(0,M.jsx)(x,{dataKey:`expenseMinor`,fill:`var(--s-expense)`,radius:[4,4,0,0],maxBarSize:24,isAnimationActive:!1}),(0,M.jsx)(f,{type:`monotone`,dataKey:`netMinor`,stroke:`var(--s-net)`,strokeWidth:2,dot:!1,activeDot:{r:4,stroke:`var(--card)`,strokeWidth:2},isAnimationActive:!1})]})})})]})}function F({values:e,color:t=`var(--s-net)`,width:n=96,height:r=26,baseline:i}){if(e.length<2)return(0,M.jsx)(`svg`,{width:n,height:r,"aria-hidden":!0});let a=Math.min(0,...e),o=Math.max(0,...e)-a||1,s=n/(e.length-1),c=e=>r-(e-a)/o*(r-4)-2,l=e.map((e,t)=>`${t===0?`M`:`L`}${(t*s).toFixed(1)},${c(e).toFixed(1)}`).join(` `),u=e[e.length-1];return(0,M.jsxs)(`svg`,{width:n,height:r,"aria-hidden":!0,className:`overflow-visible`,children:[i&&(0,M.jsx)(`line`,{x1:0,x2:n,y1:c(0),y2:c(0),stroke:`var(--line-strong)`,strokeWidth:1}),(0,M.jsx)(`path`,{d:l,fill:`none`,stroke:t,strokeWidth:1.5,strokeLinejoin:`round`,strokeLinecap:`round`}),(0,M.jsx)(`circle`,{cx:(e.length-1)*s,cy:c(u),r:2.5,fill:t,stroke:`var(--card)`,strokeWidth:1.5})]})}function I(){let{t:e}=c(),{locale:n}=u(),{range:o}=D(),s=l(o.from,o.to);if(s.isPending)return(0,M.jsx)(r,{label:e(`Crunching the numbers`)});if(s.isError)return(0,M.jsx)(a,{title:e(`Could not load analytics`),description:s.error.message});let d=s.data,f=typeof location<`u`?location.search:``;return(0,M.jsxs)(`div`,{className:t(`space-y-4`,s.isFetching&&`opacity-80 transition-opacity`),children:[(0,M.jsx)(R,{o:d}),(0,M.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-4`,children:[(0,M.jsx)(i,{className:`xl:col-span-2 min-h-[320px]`,title:e(`Cashflow`),children:d.series.length?(0,M.jsx)(`div`,{className:`h-[260px]`,children:(0,M.jsx)(P,{series:d.series,granularity:d.range.granularity})}):(0,M.jsx)(a,{title:e(`No entries in this range`)})}),(0,M.jsx)(i,{title:e(`Where the money went`),actions:(0,M.jsxs)(T,{to:{pathname:`/expenses`,search:f},className:`text-[13px] font-medium text-accent inline-flex items-center`,children:[e(`All`),` `,(0,M.jsx)(w,{className:`size-4 rtl-flip`})]}),children:(0,M.jsx)(j,{items:d.expensesByCategory.map(e=>({id:e.categoryId,...e}))})})]}),(0,M.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-4`,children:[(0,M.jsx)(i,{className:`xl:col-span-2`,title:e(`Partners`),subtitle:e(`Balances for this period`),actions:(0,M.jsxs)(T,{to:{pathname:`/stakeholders`,search:`${f?f+`&`:`?`}tab=balances`},className:`text-[13px] font-medium text-accent inline-flex items-center`,children:[e(`Settle up`),` `,(0,M.jsx)(w,{className:`size-4 rtl-flip`})]}),flush:!0,children:(0,M.jsx)(B,{o:d})}),(0,M.jsx)(i,{title:e(`Budgets`),subtitle:d.budgets.length?U(d.range.to,n):void 0,children:(0,M.jsx)(V,{o:d})})]}),(0,M.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-4`,children:[(0,M.jsx)(i,{className:`xl:col-span-2`,title:e(`Largest expenses`),flush:!0,children:(0,M.jsx)(H,{o:d})}),(0,M.jsx)(i,{title:e(`Revenue by category`),children:(0,M.jsx)(j,{items:d.revenueByCategory.map(e=>({id:e.categoryId,...e})),emptyLabel:e(`No revenue in this range`)})})]}),((d.revenueByPaymentMethod??[]).some(e=>e.paymentMethodId)||(d.expensesByPaymentMethod??[]).some(e=>e.paymentMethodId))&&(0,M.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-4`,children:[(0,M.jsx)(i,{title:e(`Revenue by payment method`),subtitle:e(`How customers paid`),actions:(0,M.jsxs)(T,{to:`/payments`,className:`text-[13px] font-medium text-accent inline-flex items-center`,children:[e(`Manage`),` `,(0,M.jsx)(w,{className:`size-4 rtl-flip`})]}),children:(0,M.jsx)(j,{items:(d.revenueByPaymentMethod??[]).map(e=>({id:e.paymentMethodId,...e})),emptyLabel:e(`No revenue in this range`)})}),(0,M.jsx)(i,{title:e(`Expenses by payment method`),subtitle:e(`How you paid`),children:(0,M.jsx)(j,{items:(d.expensesByPaymentMethod??[]).map(e=>({id:e.paymentMethodId,...e})),emptyLabel:e(`No expenses in this range`)})})]})]})}function L({value:e,invert:n}){let{t:r}=c();if(e===null||!Number.isFinite(e))return(0,M.jsx)(`span`,{className:`text-ink-3 text-[12.5px]`,children:r(`no previous period`)});Math.abs(e)<.05&&(e=0);let i=e>0,a=n?!i:i,o=e===0?y:i?g:m;return(0,M.jsxs)(`span`,{className:t(`inline-flex items-center gap-1 text-[12.5px] font-medium`,e===0?`text-ink-3`:a?`text-good`:`text-critical`),children:[(0,M.jsx)(o,{className:`size-3.5`}),` `,O(e,1),` `,(0,M.jsx)(`span`,{className:`text-ink-3 font-normal`,children:r(`vs previous`)})]})}function R({o:e}){let{t:n}=c(),{money:r}=u(),i=e.series.map(e=>e.netMinor);return(0,M.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-3 md:gap-4`,children:[(0,M.jsxs)(`div`,{className:`card p-5 md:col-span-1 flex flex-col justify-between gap-4`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`label`,children:n(`Net result`)}),(0,M.jsx)(`div`,{className:t(`num text-[34px] md:text-[36px] font-semibold tracking-[-0.02em] leading-none mt-2`,e.totals.netMinor<0?`text-critical`:`text-ink`),children:r(e.totals.netMinor,{signed:!0})}),(0,M.jsx)(`div`,{className:`mt-2`,children:(0,M.jsx)(L,{value:e.delta.netPct})})]}),(0,M.jsxs)(`div`,{className:`flex items-end justify-between gap-3`,children:[(0,M.jsxs)(`div`,{className:`text-[12.5px] text-ink-3`,children:[n(`Margin`),` `,(0,M.jsx)(`span`,{className:`num text-ink font-medium`,children:e.totals.marginPct===null?`—`:k(e.totals.marginPct,1)})]}),(0,M.jsx)(F,{values:i,width:120,height:32,baseline:!0})]})]}),(0,M.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 md:gap-4 md:col-span-2`,children:[(0,M.jsx)(z,{label:n(`Revenue`),minor:e.totals.revenueMinor,tone:`revenue`,delta:(0,M.jsx)(L,{value:e.delta.revenuePct}),count:n(`{n} entries`,{n:e.totals.revenueCount}),values:e.series.map(e=>e.revenueMinor),color:`var(--s-revenue)`}),(0,M.jsx)(z,{label:n(`Expenses`),minor:e.totals.expenseMinor,tone:`expense`,delta:(0,M.jsx)(L,{value:e.delta.expensePct,invert:!0}),count:n(`{n} entries`,{n:e.totals.expenseCount}),values:e.series.map(e=>e.expenseMinor),color:`var(--s-expense)`})]})]})}function z({label:e,minor:r,delta:i,count:a,values:o,color:s,tone:c}){let{money:l}=u();return(0,M.jsxs)(`div`,{className:`card p-4 md:p-5 flex flex-col justify-between gap-3`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsx)(n,{color:s,size:9}),(0,M.jsx)(`span`,{className:`label`,children:e})]}),(0,M.jsx)(`div`,{className:t(`num text-[22px] md:text-[26px] font-semibold tracking-[-0.02em] leading-none mt-2`,`text-ink`),children:l(r)})]}),(0,M.jsxs)(`div`,{className:`flex items-end justify-between gap-2`,children:[(0,M.jsxs)(`div`,{className:`flex flex-col gap-0.5 min-w-0`,children:[i,(0,M.jsx)(`span`,{className:`text-[12px] text-ink-3`,children:a})]}),(0,M.jsx)(`span`,{className:`hidden sm:block`,children:(0,M.jsx)(F,{values:o,color:s,width:80,height:26})})]})]})}function B({o:e}){let{t,name:n}=c(),{money:r}=u();return e.stakeholders.length?(0,M.jsx)(`ul`,{className:`divide-y divide-line`,children:e.stakeholders.map(e=>(0,M.jsxs)(`li`,{className:`px-4 md:px-5 py-3 flex items-center gap-3`,children:[(0,M.jsx)(o,{name:n(e),color:e.color,size:36}),(0,M.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,M.jsxs)(`div`,{className:`text-[14.5px] font-medium truncate`,children:[n(e),` `,(0,M.jsx)(`span`,{className:`num text-[12.5px] text-ink-3 font-normal`,children:k(e.sharePercent,0)})]}),(0,M.jsxs)(`div`,{className:`text-[12.5px] text-ink-3 truncate`,children:[t(`Paid {paid} · share {share}`,{paid:r(e.paidMinor,{compact:!0}),share:r(e.owedMinor,{compact:!0})}),(0,M.jsxs)(`span`,{className:`hidden sm:inline`,children:[` · `,t(`profit`),` `,r(e.profitShareMinor,{compact:!0,signed:!0})]})]})]}),(0,M.jsxs)(`div`,{className:`text-end shrink-0`,children:[(0,M.jsx)(A,{minor:e.netMinor,tone:`flow`,signed:!0,className:`text-[15px] font-semibold block`}),(0,M.jsx)(`span`,{className:`text-[11.5px] text-ink-3`,children:e.netMinor>0?t(`is owed`):e.netMinor<0?t(`owes`):t(`settled`)})]})]},e.id))}):(0,M.jsx)(a,{title:t(`No partners yet`),description:t(`Add stakeholders and their ownership share to start splitting expenses.`),action:(0,M.jsx)(T,{to:`/stakeholders`,children:(0,M.jsx)(E,{variant:`soft`,children:t(`Add partners`)})})})}function V({o:e}){let{t:r,name:i}=c(),{money:o}=u();return e.budgets.length?(0,M.jsx)(`ul`,{className:`space-y-4`,children:e.budgets.map(e=>(0,M.jsxs)(`li`,{children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between text-[13.5px] mb-1.5`,children:[(0,M.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,M.jsx)(n,{color:e.color,size:9}),i(e)]}),(0,M.jsxs)(`span`,{className:`num`,children:[(0,M.jsx)(`span`,{className:t(`font-medium`,e.pct>=100&&`text-critical`),children:o(e.spentMinor,{compact:!0})}),(0,M.jsxs)(`span`,{className:`text-ink-3`,children:[` / `,o(e.budgetMinor,{compact:!0})]})]})]}),(0,M.jsx)(s,{value:e.pct}),(0,M.jsx)(`div`,{className:t(`text-[12px] mt-1`,e.pct>=100?`text-critical`:e.pct>=85?`text-warning`:`text-ink-3`),children:e.remainingMinor>=0?r(`{amount} left`,{amount:o(e.remainingMinor)}):r(`{amount} over budget`,{amount:o(-e.remainingMinor)})})]},e.categoryId))}):(0,M.jsx)(a,{title:r(`No budgets`),description:r(`Set a monthly budget on an expense category to track it here.`),action:(0,M.jsx)(T,{to:`/categories`,children:(0,M.jsx)(E,{variant:`soft`,size:`sm`,children:r(`Categories`)})})})}function H({o:e}){let{t,name:r}=c(),{date:i}=u();return e.topExpenses.length?(0,M.jsx)(`ul`,{className:`divide-y divide-line`,children:e.topExpenses.slice(0,6).map(e=>(0,M.jsxs)(`li`,{className:`px-4 md:px-5 py-3 flex items-center gap-3`,children:[(0,M.jsx)(`span`,{className:`inline-flex items-center justify-center size-9 rounded-[12px] shrink-0`,style:{background:`${e.categoryColor}1f`},children:(0,M.jsx)(n,{color:e.categoryColor,size:10})}),(0,M.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,M.jsx)(`div`,{dir:`auto`,className:`text-[14.5px] font-medium truncate`,children:e.description}),(0,M.jsxs)(`div`,{className:`text-[12.5px] text-ink-3 truncate`,children:[r({name:e.categoryName,nameAr:e.categoryNameAr}),` · `,i(e.date)]})]}),(0,M.jsx)(A,{minor:e.amountMinor,className:`text-[15px] font-semibold shrink-0`})]},e.id))}):(0,M.jsx)(a,{title:t(`No expenses in this range`)})}function U(e,t){let n=new Date().toISOString().slice(0,10),r=(e<n?e:n).slice(0,7);return new Intl.DateTimeFormat(t,{month:`long`,year:`numeric`,timeZone:`UTC`}).format(new Date(`${r}-01T00:00:00Z`))}export{I as OverviewPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_t as e,a as t,c as n,d as r,ft as i,h as a,i as o,l as s,mt as c,n as l,o as u,s as d,v as f,y as p}from"./badge-DCLlsDNI.js";import{_ as m,v as h}from"./queries-CxLQqNqz.js";import{n as g,r as _,t as v}from"./star-DZj1Tpai.js";import{a as y,i as b,n as x,o as S,r as C,t as w}from"./menu-C-8r2BNA.js";import{i as T,n as E,r as D,s as O}from"./media-D6XgVZ7M.js";import{S as k,b as A,f as j,h as M,l as N,m as P,u as F}from"./index-B9WjaP25.js";import{t as I}from"./color-picker-DUPZPbk3.js";var L=e(c(),1),R=i();function z({open:e,onClose:t,method:n}){let r=M(),{t:i}=f(),{create:a,update:o}=m(),[s,c]=(0,L.useState)(``),[l,u]=(0,L.useState)(``),[d,h]=(0,L.useState)(p[0]),[g,_]=(0,L.useState)(!1),[v,y]=(0,L.useState)(!1);(0,L.useEffect)(()=>{e&&(c(n?.name??``),u(n?.nameAr??``),h(n?.color??p[Math.floor(Math.random()*7)]),_(n?.isDefault??!1),y(n?.archived??!1))},[e,n]);let b=s.trim().length>0,x=a.isPending||o.isPending,S=async()=>{let e={name:s.trim(),nameAr:l.trim()||null,color:d,isDefault:g,archived:v};try{n?await o.mutateAsync({id:n.id,...e}):await a.mutateAsync(e),r.success(i(n?`Payment method updated`:`Payment method added`)),t()}catch(e){r.error(i(`Could not save`),P(e))}};return(0,R.jsx)(F,{open:e,onClose:t,title:i(n?`Edit payment method`:`New payment method`),footer:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(j,{variant:`ghost`,size:`md`,onClick:t,children:i(`Cancel`)}),(0,R.jsx)(j,{variant:`primary`,size:`md`,onClick:S,loading:x,disabled:!b,children:i(n?`Save`:`Add`)})]}),children:(0,R.jsxs)(`form`,{className:`space-y-4`,onSubmit:e=>{e.preventDefault(),b&&S()},children:[(0,R.jsx)(D,{label:i(`Name`),required:!0,children:(0,R.jsx)(T,{value:s,onChange:e=>c(e.target.value),autoFocus:!0,placeholder:i(`Cash, Visa, Instapay, PayPal…`)})}),(0,R.jsx)(D,{label:i(`Arabic name`),hint:i(`optional`),children:(0,R.jsx)(T,{lang:`ar`,dir:`rtl`,value:l,onChange:e=>u(e.target.value),placeholder:`كاش، فيزا، إنستاباي…`})}),(0,R.jsx)(I,{value:d,onChange:h}),(0,R.jsx)(O,{checked:g,onChange:_,label:i(`Default for new entries`),description:i(`The expense and revenue forms ask for this method's amount first. Only one method can be the default.`)}),n&&(0,R.jsx)(O,{checked:!v,onChange:e=>y(!e),label:i(`Active`),description:i(v?`Archived: hidden from forms, history kept`:`Shown in forms, filters and exports`)})]})})}var B=[`Cash`,`Visa`,`Mastercard`,`Bank transfer`,`Instapay`,`Vodafone Cash`,`PayPal`,`Stripe`,`Online payment`];function V(){let[e,i]=(0,L.useState)(!1),c=h(!0),{create:p,update:T,remove:D}=m(),O=M(),{t:F,name:I}=f(),[V,H]=(0,L.useState)(void 0),[U,W]=(0,L.useState)(null),G=c.data?.items??[],K=G.filter(t=>e||!t.archived),q=B.filter(e=>!G.some(t=>t.name.toLowerCase()===e.toLowerCase()));return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(r,{title:F(`Payment methods`),subtitle:F(`Cash, cards, online… Each expense and revenue row can hold an amount per method. Shown in tables, analytics and exports.`),actions:(0,R.jsx)(j,{variant:`primary`,size:`sm`,className:`rounded-full`,icon:(0,R.jsx)(A,{className:`size-4`}),onClick:()=>H(null),children:F(`New method`)})}),(0,R.jsx)(`div`,{className:`flex items-center justify-end mb-4`,children:(0,R.jsx)(E,{label:F(`Archived`),checked:e,onChange:e=>i(e.target.checked)})}),(0,R.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-4`,children:[(0,R.jsx)(u,{className:`xl:col-span-2`,flush:!0,children:c.isPending?(0,R.jsx)(s,{}):K.length?(0,R.jsx)(`ul`,{className:`divide-y divide-line`,children:K.map(e=>(0,R.jsxs)(`li`,{className:a(`flex items-center`,e.archived&&`opacity-60`),children:[(0,R.jsx)(n,{className:`flex-1`,leading:(0,R.jsx)(t,{color:e.color,children:(0,R.jsx)(o,{color:e.color,size:12})}),title:(0,R.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[I(e),e.isDefault&&(0,R.jsx)(l,{tone:`accent`,children:F(`default`)}),e.archived&&(0,R.jsx)(l,{children:F(`archived`)})]}),onClick:()=>H(e)}),(0,R.jsx)(`div`,{className:`pe-3`,children:(0,R.jsx)(w,{trigger:()=>(0,R.jsx)(`button`,{type:`button`,className:`size-9 inline-flex items-center justify-center rounded-full text-ink-3 hover:text-ink hover:bg-card-hover`,"aria-label":F(`Actions`),children:(0,R.jsx)(S,{className:`size-4`})}),children:t=>(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(x,{icon:(0,R.jsx)(y,{}),onClick:()=>{t(),H(e)},children:F(`Edit`)}),!e.archived&&(0,R.jsx)(x,{icon:(0,R.jsx)(v,{}),onClick:async()=>{t();try{await T.mutateAsync({id:e.id,isDefault:!e.isDefault})}catch(e){O.error(F(`Failed`),P(e))}},children:F(e.isDefault?`Remove as default`:`Make default`)}),(0,R.jsx)(x,{icon:e.archived?(0,R.jsx)(_,{}):(0,R.jsx)(g,{}),onClick:async()=>{t();try{await T.mutateAsync({id:e.id,archived:!e.archived})}catch(e){O.error(F(`Failed`),P(e))}},children:F(e.archived?`Restore`:`Archive`)}),(0,R.jsx)(C,{}),(0,R.jsx)(x,{icon:(0,R.jsx)(b,{}),danger:!0,onClick:()=>{t(),W(e)},children:F(`Delete`)})]})})})]},e.id))}):(0,R.jsx)(d,{icon:(0,R.jsx)(k,{}),title:F(`No payment methods yet`),description:F(`Add the ways this project gets paid. Pick from the suggestions or create your own.`),action:(0,R.jsx)(j,{variant:`soft`,onClick:()=>H(null),children:F(`Add one`)})})}),(0,R.jsx)(u,{title:F(`Quick add`),subtitle:F(`Common ones, one tap each`),children:q.length?(0,R.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:q.map(e=>(0,R.jsx)(j,{size:`sm`,variant:`secondary`,className:`rounded-full`,icon:(0,R.jsx)(A,{className:`size-3.5`}),loading:p.isPending&&p.variables?.name===e,onClick:async()=>{try{await p.mutateAsync({name:e,isDefault:G.length===0})}catch(e){O.error(F(`Could not add`),P(e))}},children:e},e))}):(0,R.jsx)(`p`,{className:`text-[13.5px] text-ink-3`,children:F(`All suggestions are already added.`)})})]}),(0,R.jsx)(z,{open:V!==void 0,onClose:()=>H(void 0),method:V??null}),(0,R.jsx)(N,{open:!!U,onClose:()=>W(null),onConfirm:async()=>{try{await D.mutateAsync(U.id),O.success(F(`Payment method deleted`)),W(null)}catch(e){O.error(F(`Could not delete`),P(e))}},loading:D.isPending,title:F(`Delete {name}?`,{name:I(U)}),description:F(`Only possible when no revenue uses it. Otherwise archive it instead.`)})]})}export{V as PaymentsPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,M as t,O as n,V as r,W as i,_t as a,ft as o,j as s,mt as c,v as l}from"./badge-DCLlsDNI.js";var u=a(c(),1),d=o(),f=(0,u.createContext)(null);function p(){return i({queryKey:[`project`],queryFn:()=>r.get(`/project`),staleTime:6e4})}function m({project:r,children:i}){let{intlLocale:a}=l(),o=(0,u.useMemo)(()=>{let{currency:i,weekStartsOn:o,fiscalYearStartMonth:c}=r.config,l=a(r.config.locale),u={short:new Intl.DateTimeFormat(l,{day:`2-digit`,month:`short`,timeZone:`UTC`}),medium:new Intl.DateTimeFormat(l,{day:`2-digit`,month:`short`,year:`numeric`,timeZone:`UTC`}),long:new Intl.DateTimeFormat(l,{weekday:`short`,day:`2-digit`,month:`long`,year:`numeric`,timeZone:`UTC`})};return{project:r,currency:i,locale:l,weekStartsOn:o,fiscalYearStartMonth:c,digits:t(i),money:(e,t)=>n(e,i,{locale:l,...t}),toMajor:e=>s(e,i),toMinor:t=>e(t,i),date:(e,t=`medium`)=>{if(!e)return``;let n=new Date(`${e.slice(0,10)}T00:00:00Z`);return Number.isNaN(n.getTime())?e:u[t].format(n)}}},[r,a]);return(0,d.jsx)(f.Provider,{value:o,children:i})}function h(){let e=(0,u.useContext)(f);if(!e)throw Error(`useProject outside ProjectProvider`);return e}export{h as n,p as r,m as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_t as e,ft as t,g as n,h as r,l as i,mt as a,n as o,s,v as c}from"./badge-DCLlsDNI.js";import{h as l,m as u}from"./queries-CxLQqNqz.js";import{n as d}from"./project-CYHaWZqH.js";import{t as f}from"./download-gNHw92Vi.js";import{n as p}from"./search-CnrmI1BH.js";import{O as m,d as h,f as g,h as _,m as v,w as y}from"./index-B9WjaP25.js";import{n as b}from"./shift-sales-BpOCNuGY.js";var x={name:`store`,size:24,node:[[`path`,{d:`M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5`,key:`slp6dd`}],[`path`,{d:`M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244`,key:`o0xfot`}],[`path`,{d:`M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05`,key:`wn3emo`}]]};x.node;var S=n(x),C=e(a(),1),w=t();function T(){let{locale:e,project:t}=d(),n=t.config.timezone,r=new Intl.DateTimeFormat(e,{hour:`2-digit`,minute:`2-digit`,timeZone:n}),i=new Intl.DateTimeFormat(e,{weekday:`short`,day:`2-digit`,month:`short`,timeZone:n});return{time:e=>r.format(new Date(e)),day:e=>i.format(new Date(e)),window:(e,t)=>`${r.format(new Date(e))} – ${r.format(new Date(t))}`}}function E({open:e,onClose:t}){let{t:n}=c(),{money:a}=d(),x=_(),E=T(),D=l(e),{pullShift:O}=u(),[k,A]=(0,C.useState)(null),[j,M]=(0,C.useState)(null);(0,C.useEffect)(()=>{e&&A(null)},[e]);let N=async e=>{M(e.externalId);try{let t=await O.mutateAsync({shiftId:e.externalId});A(t),x.success(n(t.created?`Shift added to revenue`:`Shift revenue updated`),`${t.revenue.description} · ${a(t.revenue.amountMinor)}`)}catch(e){x.error(n(`Could not pull the shift`),v(e))}finally{M(null)}},P=D.data?.[0];return(0,w.jsx)(h,{open:e,onClose:t,title:n(k?`Shift pulled`:`Pull a shift from Loyverse`),description:k?k.revenue.description:n(`Closed shifts, newest first. Only the payment types chosen in the integration settings go on the row.`),width:520,footer:k?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(g,{variant:`ghost`,size:`md`,onClick:()=>A(null),children:n(`Pull another`)}),(0,w.jsx)(g,{variant:`primary`,size:`md`,onClick:t,children:n(`Done`)})]}):(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(g,{variant:`ghost`,size:`md`,icon:(0,w.jsx)(p,{className:r(`size-4`,D.isFetching&&`animate-spin`)}),onClick:()=>D.refetch(),disabled:D.isFetching,children:n(`Refresh`)}),(0,w.jsx)(g,{variant:`primary`,size:`md`,icon:(0,w.jsx)(f,{className:`size-4`}),loading:!!j&&j===P?.externalId,disabled:!P||!!j,onClick:()=>P&&N(P),children:P?.pulled?n(`Re-pull last shift`):n(`Pull last shift`)})]}),children:k?(0,w.jsxs)(`div`,{className:`space-y-4`,children:[(0,w.jsxs)(`div`,{className:`card p-4 flex items-center gap-3`,children:[(0,w.jsx)(`span`,{className:`size-10 rounded-full bg-revenue-soft text-revenue inline-flex items-center justify-center shrink-0`,children:(0,w.jsx)(y,{className:`size-5`})}),(0,w.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,w.jsx)(`div`,{className:`text-[13px] text-ink-3`,children:n(k.created?`New revenue row`:`Existing row updated`)}),(0,w.jsx)(`div`,{className:`num text-[22px] font-semibold tracking-tight text-revenue`,children:a(k.revenue.amountMinor)}),(0,w.jsx)(`div`,{className:`text-[12.5px] text-ink-3 truncate`,children:k.revenue.payments.filter(e=>e.amountMinor>0).map(e=>`${e.name} ${a(e.amountMinor,{compact:!0})}`).join(` · `)})]})]}),(0,w.jsx)(b,{sales:k.sales,compact:!0})]}):D.isPending?(0,w.jsx)(i,{label:n(`Asking Loyverse for the latest shifts`)}):D.isError?(0,w.jsx)(s,{title:n(`Could not reach Loyverse`),description:D.error.message,action:(0,w.jsx)(m,{to:`/integrations`,children:(0,w.jsx)(g,{variant:`soft`,size:`sm`,children:n(`Integration settings`)})})}):D.data.length?(0,w.jsx)(`ul`,{className:`divide-y divide-line -mx-1`,children:D.data.map((e,t)=>{let i=e.payments.filter(e=>e.selected&&e.amountMinor!==0),s=i.reduce((e,t)=>e+t.amountMinor,0);return(0,w.jsxs)(`li`,{className:r(`flex items-center gap-3 px-1 py-3`,t===0&&`bg-accent-soft/40 rounded-[12px]`),children:[(0,w.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,w.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,w.jsx)(`span`,{className:`text-[14.5px] font-medium`,children:E.day(e.openedAt)}),(0,w.jsx)(`span`,{className:`num text-[12.5px] text-ink-3`,children:E.window(e.openedAt,e.closedAt)}),e.storeName&&(0,w.jsx)(o,{children:e.storeName}),e.pulled&&(0,w.jsx)(o,{tone:e.pulled.revenueId?`good`:`warning`,children:e.pulled.revenueId?n(`in ledger`):n(`row deleted`)})]}),(0,w.jsxs)(`div`,{className:`text-[12.5px] text-ink-3 mt-0.5 truncate`,children:[i.length?i.map(e=>`${e.name} ${a(e.amountMinor,{compact:!0})}`).join(` · `):n(`nothing through the selected payment types`),e.paidOutMinor>0&&(0,w.jsxs)(`span`,{children:[` · `,n(`pay-outs −{amount}`,{amount:a(e.paidOutMinor,{compact:!0})})]}),e.netSalesMinor?(0,w.jsxs)(`span`,{children:[` · `,n(`net sales {amount}`,{amount:a(e.netSalesMinor,{compact:!0})})]}):null]})]}),(0,w.jsxs)(`div`,{className:`text-end shrink-0`,children:[(0,w.jsx)(`div`,{className:`num text-[15px] font-semibold text-revenue`,children:a(s)}),(0,w.jsx)(g,{size:`xs`,variant:t===0?`primary`:`secondary`,className:`mt-1`,loading:j===e.externalId,disabled:!!j,onClick:()=>N(e),children:e.pulled?.revenueId?n(`Re-pull`):n(`Pull`)})]})]},e.externalId)})}):(0,w.jsx)(s,{icon:(0,w.jsx)(S,{}),title:n(`No closed shifts yet`),description:n(`Close the shift in the Loyverse POS app, then pull it here.`)})})}export{S as n,E as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,K as t,V as n,W as r,Y as i,Z as a,_t as o,ct as s,dt as c,it as l,mt as u,q as d,st as f,tt as p}from"./badge-DCLlsDNI.js";var m=class extends t{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||h(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??(this.state.status===`pending`?this.execute(this.state.variables):Promise.resolve())}async execute(e){let t=()=>{this.#i({type:`continue`})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey},r=this.#r=d({fn:()=>this.options.mutationFn?this.options.mutationFn(e,n):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)}),i=this.state.status===`pending`,a=!r.canStart();try{if(i)t();else{this.#i({type:`pending`,variables:e,isPaused:a}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,n);let t=await this.options.onMutate?.(e,n);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:a})}let o=await r.start();return await this.#n.config.onSuccess?.(o,e,this.state.context,this,n),await this.options.onSuccess?.(o,e,this.state.context,n),await this.#n.config.onSettled?.(o,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(o,null,e,this.state.context,n),this.#i({type:`success`,data:o}),o}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,n)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,n)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#r===r&&(this.#r=void 0),this.#n.runNext(this)}}#i(e){let t=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=t(this.state),i.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function h(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}var g=class extends a{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(t){let n=this.options;this.options=this.#e.defaultMutationOptions(t),f(this.options,n)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),n?.mutationKey&&this.options.mutationKey&&e(n.mutationKey)!==e(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onSubscribe(){this.listeners.size===1&&this.#n&&(this.#n.addObserver(this),this.#i())}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??h();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){i.batch(()=>{let t=this.#r;if(t&&this.hasListeners()){let n=this.#t.variables,r=this.#t.context,i={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{t.onSuccess?.(e.data,n,r,i)}catch(e){Promise.reject(e)}try{t.onSettled?.(e.data,null,n,r,i)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{t.onError?.(e.error,n,r,i)}catch(e){Promise.reject(e)}try{t.onSettled?.(void 0,e.error,n,r,i)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},_=o(u(),1);function v(e,t){let n=c(t),[r]=_.useState(()=>new g(n,e));_.useEffect(()=>{r.setOptions(e)},[r,e]);let a=_.useSyncExternalStore(_.useCallback(e=>r.subscribe(i.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),o=_.useCallback((...e)=>{r.mutate(e[0],e[1]).catch(l)},[r]);if(a.error&&s(r.options.throwOnError,[a.error]))throw a.error;return{...a,mutate:o,mutateAsync:a.mutate}}function y(e){return Array.isArray(e)?{items:e}:e}function b(){let e=c();return()=>Promise.all([e.invalidateQueries({queryKey:[`expenses`]}),e.invalidateQueries({queryKey:[`revenue`]}),e.invalidateQueries({queryKey:[`analytics`]}),e.invalidateQueries({queryKey:[`balances`]}),e.invalidateQueries({queryKey:[`distribution`]}),e.invalidateQueries({queryKey:[`budgets`]}),e.invalidateQueries({queryKey:[`settlements`]}),e.invalidateQueries({queryKey:[`stakeholders`]}),e.invalidateQueries({queryKey:[`categories`]}),e.invalidateQueries({queryKey:[`payment-methods`]}),e.invalidateQueries({queryKey:[`recurring`]}),e.invalidateQueries({queryKey:[`audit`]}),e.invalidateQueries({queryKey:[`project`]}),e.invalidateQueries({queryKey:[`branding`]})])}var x=(e,t)=>r({queryKey:[`analytics`,e,t],queryFn:()=>n.get(`/analytics/overview`,{from:e,to:t}),placeholderData:p}),S=e=>r({queryKey:[`analytics`,`insights`,e],queryFn:()=>n.get(`/analytics/insights`,e),placeholderData:p}),C=()=>r({queryKey:[`stakeholders`],queryFn:()=>n.get(`/stakeholders`).then(e=>Array.isArray(e)?{items:e,shareTotal:e.filter(e=>e.active).reduce((e,t)=>e+t.sharePercent,0)}:e),staleTime:3e4}),w=(e,t)=>r({queryKey:[`balances`,e,t],queryFn:()=>n.get(`/stakeholders/balances`,{from:e,to:t}),placeholderData:p}),T=(e,t)=>r({queryKey:[`distribution`,e,t],queryFn:()=>n.get(`/stakeholders/distribution`,{from:e,to:t}),placeholderData:p});function E(){let e=b();return{create:v({mutationFn:e=>n.post(`/stakeholders`,e),onSuccess:e}),update:v({mutationFn:({id:e,...t})=>n.patch(`/stakeholders/${e}`,t),onSuccess:e}),remove:v({mutationFn:({id:e,force:t})=>n.delete(`/stakeholders/${e}`,{force:t}),onSuccess:e})}}var D=(e,t=!1)=>r({queryKey:[`categories`,e??`all`,t],queryFn:()=>n.get(`/categories`,{kind:e,includeArchived:t||void 0}).then(y),staleTime:3e4}),O=e=>r({queryKey:[`budgets`,e],queryFn:()=>n.get(`/categories/budgets`,{month:e}).then(t=>({month:(Array.isArray(t)?void 0:t.month)??e??new Date().toISOString().slice(0,7),items:Array.isArray(t)?t:t.items}))});function k(){let e=b();return{create:v({mutationFn:e=>n.post(`/categories`,e),onSuccess:e}),update:v({mutationFn:({id:e,...t})=>n.patch(`/categories/${e}`,t),onSuccess:e}),remove:v({mutationFn:e=>n.delete(`/categories/${e}`),onSuccess:e})}}var A=(e=!1)=>r({queryKey:[`payment-methods`,e],queryFn:()=>n.get(`/payment-methods`,{includeArchived:e||void 0}).then(y),staleTime:3e4});function j(){let e=b();return{create:v({mutationFn:e=>n.post(`/payment-methods`,e),onSuccess:e}),update:v({mutationFn:({id:e,...t})=>n.patch(`/payment-methods/${e}`,t),onSuccess:e}),remove:v({mutationFn:e=>n.delete(`/payment-methods/${e}`),onSuccess:e}),reorder:v({mutationFn:e=>n.post(`/payment-methods/reorder`,{ids:e}),onSuccess:e})}}var M=e=>r({queryKey:[`expenses`,e],queryFn:()=>n.get(`/expenses`,e),placeholderData:p}),N=e=>r({queryKey:[`revenue`,e],queryFn:()=>n.get(`/revenue`,e),placeholderData:p});function P(){let e=b();return{create:v({mutationFn:e=>n.post(`/expenses`,e),onSuccess:e}),update:v({mutationFn:({id:e,...t})=>n.patch(`/expenses/${e}`,t),onSuccess:e}),remove:v({mutationFn:e=>n.delete(`/expenses/${e}`),onSuccess:e}),bulkDelete:v({mutationFn:e=>n.post(`/expenses/bulk-delete`,{ids:e}),onSuccess:e}),recompute:v({mutationFn:e=>n.post(`/expenses/${e}/recompute-split`),onSuccess:e}),recomputeRange:v({mutationFn:e=>n.post(`/expenses/recompute-splits`,e),onSuccess:e}),setPayment:v({mutationFn:({id:e,paymentMethodId:t,amountMinor:r})=>n.put(`/expenses/${e}/payments/${t}`,{amountMinor:r}),onSuccess:e})}}function F(){let e=b();return{create:v({mutationFn:e=>n.post(`/revenue`,e),onSuccess:e}),update:v({mutationFn:({id:e,...t})=>n.patch(`/revenue/${e}`,t),onSuccess:e}),remove:v({mutationFn:e=>n.delete(`/revenue/${e}`),onSuccess:e}),bulkDelete:v({mutationFn:e=>n.post(`/revenue/bulk-delete`,{ids:e}),onSuccess:e}),setPayment:v({mutationFn:({id:e,paymentMethodId:t,amountMinor:r})=>n.put(`/revenue/${e}/payments/${t}`,{amountMinor:r}),onSuccess:e})}}var I=e=>r({queryKey:[`settlements`,e],queryFn:()=>n.get(`/settlements`,e),placeholderData:p});function L(){let e=b();return{create:v({mutationFn:e=>n.post(`/settlements`,e),onSuccess:e}),update:v({mutationFn:({id:e,...t})=>n.patch(`/settlements/${e}`,t),onSuccess:e}),remove:v({mutationFn:e=>n.delete(`/settlements/${e}`),onSuccess:e})}}var R=(e,t=!1)=>r({queryKey:[`custom-fields`,e??`all`,t],queryFn:()=>n.get(`/custom-fields`,{entity:e,includeArchived:t||void 0}).then(y),staleTime:6e4});function z(){let e=c(),t=()=>e.invalidateQueries({queryKey:[`custom-fields`]});return{create:v({mutationFn:e=>n.post(`/custom-fields`,e),onSuccess:t}),update:v({mutationFn:({id:e,...t})=>n.patch(`/custom-fields/${e}`,t),onSuccess:t}),remove:v({mutationFn:e=>n.delete(`/custom-fields/${e}`),onSuccess:t}),reorder:v({mutationFn:e=>n.post(`/custom-fields/reorder`,{ids:e}),onSuccess:t})}}var B=()=>r({queryKey:[`recurring`],queryFn:()=>n.get(`/recurring`).then(y)});function V(){let e=b();return{create:v({mutationFn:e=>n.post(`/recurring`,e),onSuccess:e}),update:v({mutationFn:({id:e,...t})=>n.patch(`/recurring/${e}`,t),onSuccess:e}),remove:v({mutationFn:e=>n.delete(`/recurring/${e}`),onSuccess:e}),run:v({mutationFn:e=>n.post(e?`/recurring/${e}/run`:`/recurring/run`),onSuccess:e})}}function H(){return{update:v({mutationFn:e=>n.patch(`/project`,e),onSuccess:b()})}}var U=e=>r({queryKey:[`audit`,e],queryFn:()=>n.get(`/audit`,e),placeholderData:p}),W=()=>r({queryKey:[`integrations`,`loyverse`],queryFn:()=>n.get(`/integrations/loyverse`),staleTime:3e4}),G=(e,t=!0)=>r({queryKey:[`integrations`,`loyverse`,`items`,e],queryFn:()=>n.get(`/integrations/loyverse/items`,e),placeholderData:p,enabled:t}),K=(e,t=10)=>r({queryKey:[`integrations`,`loyverse`,`shifts`,t],queryFn:()=>n.get(`/integrations/loyverse/shifts`,{limit:t}),enabled:e,staleTime:15e3}),q=e=>r({queryKey:[`integrations`,`loyverse`,`sales`,e],queryFn:()=>n.get(`/integrations/loyverse/shifts/${e}/sales`),enabled:!!e,staleTime:6e4});function J(){let e=c(),t=b(),r=()=>e.invalidateQueries({queryKey:[`integrations`]});return{connect:v({mutationFn:e=>n.post(`/integrations/loyverse/connect`,e),onSuccess:r}),disconnect:v({mutationFn:()=>n.delete(`/integrations/loyverse`),onSuccess:()=>Promise.all([r(),t()])}),settings:v({mutationFn:e=>n.put(`/integrations/loyverse/settings`,e),onSuccess:r}),syncItems:v({mutationFn:()=>n.post(`/integrations/loyverse/sync-items`),onSuccess:r}),pullShift:v({mutationFn:e=>n.post(`/integrations/loyverse/pull-shift`,e),onSuccess:()=>Promise.all([r(),t()])})}}export{F as C,E as D,q as E,C as O,N as S,I as T,j as _,k as a,B as b,T as c,S as d,W as f,x as g,K as h,D as i,m as k,P as l,J as m,w as n,z as o,G as p,O as r,R as s,U as t,M as u,A as v,L as w,V as x,H as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_t as e,a as t,c as n,d as r,f as i,ft as a,g as o,h as s,l as c,mt as l,n as u,o as d,s as f,v as p,z as m}from"./badge-DCLlsDNI.js";import{O as h,b as g,i as _,v,x as y}from"./queries-CxLQqNqz.js";import{n as b}from"./project-CYHaWZqH.js";import{a as x,i as S,n as C,o as w,r as T,t as E}from"./menu-C-8r2BNA.js";import{a as D,i as O,o as k,r as A,s as ee}from"./media-D6XgVZ7M.js";import{t as te}from"./money-input-DQaEauAw.js";import{b as j,c as ne,d as re,f as M,h as N,l as P,m as F,s as ie,y as I}from"./index-B9WjaP25.js";import{t as L}from"./money-OFUBQ3gl.js";var R={name:`pause`,size:24,node:[[`rect`,{x:`14`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`kaeet6`}],[`rect`,{x:`5`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`1wsw3u`}]]};R.node;var z=o(R),B={name:`play`,size:24,node:[[`path`,{d:`M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z`,key:`10ikf1`}]]};B.node;var V=o(B),H={name:`zap`,size:24,node:[[`path`,{d:`M15.914 4a1.5 1.5 0 00-2.474-1.561l-9 9A1.5 1.5 0 005.5 14h4.002a.5.5 0 01.471.666L8.086 20a1.5 1.5 0 002.475 1.56l9-9A1.5 1.5 0 0018.5 10h-3.997a.5.5 0 01-.472-.667z`,key:`1v7up4`}]]};H.node;var U=o(H),W=e(l(),1),G=a(),ae=[{id:`daily`,label:`Daily`},{id:`weekly`,label:`Weekly`},{id:`monthly`,label:`Monthly`},{id:`quarterly`,label:`Quarterly`},{id:`yearly`,label:`Yearly`}];function K({open:e,onClose:t,rule:n}){let r=N(),{t:a,name:o}=p(),{create:s,update:c}=y(),l=h(),[u,d]=(0,W.useState)(`expense`),f=_(u),g=v(),[b,x]=(0,W.useState)(``),[S,C]=(0,W.useState)(``),[w,T]=(0,W.useState)(`monthly`),[E,j]=(0,W.useState)(1),[P,I]=(0,W.useState)(m()),[L,R]=(0,W.useState)(``),[z,B]=(0,W.useState)(!0),[V,H]=(0,W.useState)(``),[U,K]=(0,W.useState)(null),[q,J]=(0,W.useState)(``),[Y,X]=(0,W.useState)(``),[Z,oe]=(0,W.useState)(``),[se,Q]=(0,W.useState)(``),[$,ce]=(0,W.useState)(`ownership`),[le,ue]=(0,W.useState)([]),[de,fe]=(0,W.useState)({});(0,W.useEffect)(()=>{e&&(d(n?.kind??`expense`),C(n?.name??``),T(n?.frequency??`monthly`),j(n?.interval??1),I(n?.startDate??m()),R(n?.endDate??``),B(n?.active??!0),H(n?.template.description??``),K(n?.template.amountMinor??null),J(n?.template.categoryId??``),X(n?.template.partyStakeholderId??``),oe(n?.template.vendorOrSource??``),Q(n?.template.notes??``),ce(n?.template.splitMode??`ownership`),ue(n?.template.customSplits??[]),fe(n?.template.customFields??{}),x(n?.template.paymentMethodId??``))},[e,n]),(0,W.useEffect)(()=>{if(!e||n||q)return;let t=f.data?.items.find(e=>e.isDefault&&!e.archived);t&&J(t.id)},[e,n,q,f.data]);let pe=S.trim()&&V.trim()&&U!==null&&U>0&&!!P&&(u===`revenue`||!!q)&&E>=1,me=s.isPending||c.isPending,he=async()=>{let e={kind:u,name:S.trim(),frequency:w,interval:E,startDate:P,endDate:L||null,active:z,template:{description:V.trim(),amountMinor:U,categoryId:q||null,partyStakeholderId:Y||null,paymentMethodId:b||null,vendorOrSource:Z.trim()||null,notes:se.trim()||null,splitMode:$,customSplits:$===`custom`?le:[],customFields:de}};try{if(n){let{kind:t,...r}=e;await c.mutateAsync({id:n.id,...r})}else await s.mutateAsync(e);r.success(a(n?`Rule updated`:`Recurring rule created`)),t()}catch(e){r.error(a(`Could not save rule`),F(e))}};return(0,G.jsx)(re,{open:e,onClose:t,title:a(n?`Edit recurring rule`:`New recurring rule`),description:a(`Entries are generated automatically when they come due (checked hourly and on start).`),width:520,footer:(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(M,{variant:`ghost`,size:`md`,onClick:t,className:`max-md:hidden`,children:a(`Cancel`)}),(0,G.jsx)(M,{variant:`primary`,size:`lg`,onClick:he,loading:me,disabled:!pe,className:`w-full md:w-auto`,children:a(n?`Save`:`Create rule`)})]}),children:(0,G.jsxs)(`form`,{className:`space-y-4`,onSubmit:e=>{e.preventDefault(),pe&&he()},children:[!n&&(0,G.jsx)(i,{value:u,onChange:e=>{d(e),J(``)},items:[{id:`expense`,label:a(`Expense`)},{id:`revenue`,label:a(`Revenue`)}]}),(0,G.jsx)(A,{label:a(`Rule name`),required:!0,children:(0,G.jsx)(O,{value:S,onChange:e=>C(e.target.value),placeholder:a(`Office rent`),autoFocus:!n})}),(0,G.jsxs)(`div`,{className:`grid grid-cols-[1fr_80px] gap-3`,children:[(0,G.jsx)(A,{label:a(`Frequency`),children:(0,G.jsx)(D,{value:w,onChange:e=>T(e.target.value),children:ae.map(e=>(0,G.jsx)(`option`,{value:e.id,children:a(e.label)},e.id))})}),(0,G.jsx)(A,{label:a(`Every`),hint:a(`n`),children:(0,G.jsx)(O,{mono:!0,type:`number`,min:1,max:365,value:E,onChange:e=>j(Math.max(1,Number(e.target.value)||1))})})]}),(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,G.jsx)(A,{label:a(`First occurrence`),required:!0,children:(0,G.jsx)(O,{mono:!0,type:`date`,value:P,onChange:e=>I(e.target.value)})}),(0,G.jsx)(A,{label:a(`Ends`),hint:a(`optional`),children:(0,G.jsx)(O,{mono:!0,type:`date`,value:L,min:P,onChange:e=>R(e.target.value)})})]}),(0,G.jsx)(ee,{checked:z,onChange:B,label:a(`Active`),description:a(z?`Generates entries when due`:`Paused: nothing is generated`)}),(0,G.jsx)(`div`,{className:`pt-4 mt-2 border-t border-line`,children:(0,G.jsx)(`span`,{className:`label`,children:a(`Entry template`)})}),(0,G.jsx)(A,{label:a(`Description`),required:!0,children:(0,G.jsx)(O,{value:V,onChange:e=>H(e.target.value)})}),(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,G.jsx)(A,{label:a(`Amount`),required:!0,children:(0,G.jsx)(te,{value:U,onChange:K})}),(0,G.jsx)(A,{label:a(`Category`),required:u===`expense`,children:(0,G.jsxs)(D,{value:q,onChange:e=>J(e.target.value),children:[(0,G.jsx)(`option`,{value:``,children:a(u===`expense`?`Select…`:`Uncategorised`)}),f.data?.items.map(e=>(0,G.jsx)(`option`,{value:e.id,children:o(e)},e.id))]})})]}),(0,G.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,G.jsx)(A,{label:a(u===`expense`?`Paid by`:`Received by`),children:(0,G.jsxs)(D,{value:Y,onChange:e=>X(e.target.value),children:[(0,G.jsx)(`option`,{value:``,children:a(`Company pool`)}),l.data?.items.map(e=>(0,G.jsx)(`option`,{value:e.id,children:o(e)},e.id))]})}),(0,G.jsx)(A,{label:a(u===`expense`?`Vendor`:`Source`),children:(0,G.jsx)(O,{value:Z,onChange:e=>oe(e.target.value)})})]}),(g.data?.items.length??0)>0&&(0,G.jsx)(A,{label:a(`Payment method`),hint:a(`blank = default`),children:(0,G.jsxs)(D,{value:b,onChange:e=>x(e.target.value),children:[(0,G.jsx)(`option`,{value:``,children:a(`Default method`)}),g.data?.items.map(e=>(0,G.jsx)(`option`,{value:e.id,children:o(e)},e.id))]})}),u===`expense`&&(0,G.jsx)(ie,{stakeholders:l.data?.items??[],amountMinor:U,mode:$,onMode:ce,splits:le,onSplits:ue}),(0,G.jsx)(A,{label:a(`Notes`),children:(0,G.jsx)(k,{value:se,onChange:e=>Q(e.target.value)})}),(0,G.jsx)(ne,{entity:u,values:de,onChange:fe})]})})}var q={daily:`Every day`,weekly:`Every week`,monthly:`Every month`,quarterly:`Every quarter`,yearly:`Every year`},J={daily:`Every {n} days`,weekly:`Every {n} weeks`,monthly:`Every {n} months`,quarterly:`Every {n} quarters`,yearly:`Every {n} years`};function Y(e,t){return e.interval===1?t(q[e.frequency]):t(J[e.frequency],{n:e.interval})}function X(){let e=g(),{update:i,remove:a,run:o}=y(),l=N(),{t:m}=p(),{date:h}=b(),[_,v]=(0,W.useState)(void 0),[D,O]=(0,W.useState)(null),k=e.data?.items??[],A=new Date().toISOString().slice(0,10);return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(r,{title:m(`Recurring`),subtitle:m(`Rent, retainers, subscriptions: added automatically when due.`),actions:(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(M,{variant:`secondary`,size:`sm`,className:`rounded-full`,icon:(0,G.jsx)(U,{className:`size-4`}),onClick:async()=>{try{let e=await o.mutateAsync(void 0);l.success(e.generated.length?m(`Generated {n} entries`,{n:e.generated.length}):m(`Nothing due right now`))}catch(e){l.error(m(`Run failed`),F(e))}},loading:o.isPending,children:m(`Run due now`)}),(0,G.jsx)(M,{variant:`primary`,size:`sm`,className:`rounded-full`,icon:(0,G.jsx)(j,{className:`size-4`}),onClick:()=>v(null),children:m(`New rule`)})]})}),(0,G.jsx)(d,{flush:!0,children:e.isPending?(0,G.jsx)(c,{}):k.length?(0,G.jsx)(`ul`,{className:`divide-y divide-line`,children:k.map(e=>{let r=e.active&&e.nextRunAt<=A;return(0,G.jsxs)(`li`,{className:s(`flex items-center`,!e.active&&`opacity-60`),children:[(0,G.jsx)(n,{className:`flex-1`,leading:(0,G.jsx)(t,{color:e.kind===`expense`?`var(--s-expense)`:`var(--s-revenue)`,children:(0,G.jsx)(I,{className:`size-4`})}),title:(0,G.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[e.name,e.active?r?(0,G.jsx)(u,{tone:`warning`,children:m(`due`)}):null:(0,G.jsx)(u,{children:m(`paused`)})]}),subtitle:`${Y(e,m)} · ${m(`next {date}`,{date:h(e.nextRunAt)})}${e.endDate?` · ${m(`ends {date}`,{date:h(e.endDate)})}`:``} · ${m(`{n} generated`,{n:e.generatedCount})}`,trailing:(0,G.jsx)(L,{minor:e.template.amountMinor,tone:e.kind===`expense`?`expense`:`revenue`,className:`text-[15px] font-semibold`}),onClick:()=>v(e)}),(0,G.jsx)(`div`,{className:`pe-3`,children:(0,G.jsx)(E,{trigger:()=>(0,G.jsx)(`button`,{type:`button`,className:`size-9 inline-flex items-center justify-center rounded-full text-ink-3 hover:text-ink hover:bg-card-hover`,"aria-label":m(`Actions`),children:(0,G.jsx)(w,{className:`size-4`})}),children:t=>(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(C,{icon:(0,G.jsx)(x,{}),onClick:()=>{t(),v(e)},children:m(`Edit`)}),(0,G.jsx)(C,{icon:(0,G.jsx)(U,{}),onClick:async()=>{t();try{let t=await o.mutateAsync(e.id);l.success(t.generated.length?m(`Generated {n}`,{n:t.generated.length}):m(`Nothing due`))}catch(e){l.error(m(`Run failed`),F(e))}},children:m(`Run now`)}),(0,G.jsx)(C,{icon:e.active?(0,G.jsx)(z,{}):(0,G.jsx)(V,{}),onClick:async()=>{t();try{await i.mutateAsync({id:e.id,active:!e.active})}catch(e){l.error(m(`Failed`),F(e))}},children:m(e.active?`Pause`:`Resume`)}),(0,G.jsx)(T,{}),(0,G.jsx)(C,{icon:(0,G.jsx)(S,{}),danger:!0,onClick:()=>{t(),O(e)},children:m(`Delete`)})]})})})]},e.id)})}):(0,G.jsx)(f,{icon:(0,G.jsx)(I,{}),title:m(`No recurring rules`),description:m(`Create one for rent, salaries or retainers and ledgr adds the entries on schedule.`),action:(0,G.jsx)(M,{variant:`soft`,onClick:()=>v(null),children:m(`New rule`)})})}),(0,G.jsx)(K,{open:_!==void 0,onClose:()=>v(void 0),rule:_??null}),(0,G.jsx)(P,{open:!!D,onClose:()=>O(null),onConfirm:async()=>{try{await a.mutateAsync(D.id),l.success(m(`Rule deleted`)),O(null)}catch(e){l.error(m(`Delete failed`),F(e))}},loading:a.isPending,title:m(`Delete “{name}”?`,{name:D?.name??``}),description:m(`Entries already generated stay in the ledger.`)})]})}export{X as RecurringPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{U as e,_t as t,d as n,ft as r,h as i,i as a,mt as o,n as ee,o as s,r as te,s as ne,t as re,v as ie}from"./badge-DCLlsDNI.js";import{C as ae,O as oe,S as se,f as ce,i as le,s as ue,v as de}from"./queries-CxLQqNqz.js";import{n as fe}from"./project-CYHaWZqH.js";import{a as c,i as l,n as u,o as pe,r as me,t as he}from"./table-QAdUTXQz.js";import{t as ge}from"./download-gNHw92Vi.js";import{a as _e,i as d,n as f,o as p,r as m,t as ve}from"./menu-C-8r2BNA.js";import{a as ye,i as be,n as xe,r as Se,t as Ce}from"./ledger-toolbar-B_Gbv5Ws.js";import{t as we}from"./pull-shift-sheet-BaOiY46Z.js";import{n as h,t as Te}from"./media-D6XgVZ7M.js";import{a as Ee,b as g,f as _,h as De,l as Oe,m as v,p as ke,u as Ae}from"./index-B9WjaP25.js";import{t as y}from"./money-OFUBQ3gl.js";import{t as b}from"./custom-cell-DOJAsRPW.js";import{t as je}from"./shift-sales-BpOCNuGY.js";var x=t(o(),1),S=r(),Me=50;function C(){let{t,name:r,label:o}=ie(),C=e=>r({name:e.name??``,nameAr:e.nameAr}),{range:w}=ke(),{date:T,money:E}=fe(),D=xe(),O=De(),Ne=Te(),Pe=le(`revenue`,!0),Fe=oe(),Ie=ue(`revenue`),k=de(!0),A=!!ce().data?.connected,[Le,j]=(0,x.useState)(!1),Re=(0,x.useMemo)(()=>({from:w.from,to:w.to,q:D.q,categoryId:D.categoryId,stakeholderId:D.stakeholderId,paymentMethodId:D.paymentMethodId,sort:D.sort,order:D.order,page:D.page,pageSize:Me}),[w,D.q,D.categoryId,D.stakeholderId,D.paymentMethodId,D.sort,D.order,D.page]),M=se(Re),{remove:N,bulkDelete:P}=ae(),[F,I]=(0,x.useState)(void 0),[L,R]=(0,x.useState)(null),[z,B]=(0,x.useState)(new Set),[V,H]=(0,x.useState)(!1),[ze,U]=(0,x.useState)(!1),[W,G]=(0,x.useState)(null),[Be,K]=(0,x.useState)(null),q=(0,x.useMemo)(()=>(k.data?.items??[]).filter(e=>!e.archived),[k.data]),J=M.data?.items??[],Y=Ie.data?.items??[],X=J.length>0&&J.every(e=>z.has(e.id)),Ve=()=>B(X?new Set:new Set(J.map(e=>e.id))),Z=e=>B(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),Q=e=>D.set({sort:e,order:D.sort===e&&D.order===`desc`?`asc`:`desc`}),$=e=>D.sort===e?D.order:null,He=(n=`xlsx`)=>e(`/export/revenue.${n}`,`revenue.${n}`,{from:w.from,to:w.to}).catch(e=>O.error(t(`Export failed`),v(e))),Ue=(0,x.useMemo)(()=>{let e=new Map;for(let t of J)e.set(t.date,[...e.get(t.date)??[],t]);return[...e.entries()]},[J]);return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(n,{title:t(`Revenue`),subtitle:M.data?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(y,{minor:M.data.totals.amountMinor,className:`text-ink font-medium`}),` `,t(`across {n} entries`,{n:M.data.totals.count})]}):t(`Loading…`),actions:(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(ve,{trigger:()=>(0,S.jsx)(_,{variant:`secondary`,size:`sm`,icon:(0,S.jsx)(p,{className:`size-4`}),className:`rounded-full`,children:t(`More`)}),title:t(`Revenue`),children:e=>(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(f,{icon:V?(0,S.jsx)(ye,{}):(0,S.jsx)(be,{}),onClick:()=>{e(),H(e=>!e),B(new Set)},children:t(V?`Done selecting`:`Select entries`)}),(0,S.jsx)(m,{}),(0,S.jsx)(f,{icon:(0,S.jsx)(d,{}),danger:!0,disabled:!z.size,onClick:()=>{e(),U(!0)},children:t(`Delete {n} selected`,{n:z.size||``})})]})}),A&&(0,S.jsx)(_,{variant:`primary`,size:`sm`,className:`rounded-full`,icon:(0,S.jsx)(ge,{className:`size-4`}),onClick:()=>j(!0),children:t(`Pull last shift`)}),(0,S.jsx)(_,{variant:A?`secondary`:`primary`,size:`sm`,className:`rounded-full max-md:hidden`,icon:(0,S.jsx)(g,{className:`size-4`}),onClick:()=>I(null),children:t(`New revenue`)})]})}),(0,S.jsx)(`div`,{className:`mb-3`,children:(0,S.jsx)(Ce,{categories:Pe.data?.items.filter(e=>!e.archived)??[],stakeholders:Fe.data?.items??[],paymentMethods:k.data?.items.filter(e=>!e.archived)??[],stakeholderLabel:`Received by`,onExport:He})}),V&&J.length>0&&(0,S.jsxs)(`div`,{className:`mb-3 flex items-center justify-between gap-2 card px-4 py-2 fade-up`,children:[(0,S.jsx)(h,{label:t(X?`Deselect all on page`:`Select all on page`),checked:X,onChange:Ve}),(0,S.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(_,{size:`xs`,variant:`ghost`,onClick:()=>{H(!1),B(new Set)},children:t(`Done`)}),(0,S.jsx)(_,{size:`xs`,variant:`danger`,disabled:!z.size,icon:(0,S.jsx)(d,{className:`size-3.5`}),onClick:()=>U(!0),children:t(`Delete {n}`,{n:z.size||``})})]})]}),Ne?(0,S.jsxs)(`div`,{className:`space-y-4`,children:[M.isPending&&(0,S.jsx)(s,{children:(0,S.jsx)(`div`,{className:`py-10 text-center text-ink-3`,children:t(`Loading…`)})}),!M.isPending&&!J.length&&(0,S.jsx)(s,{children:(0,S.jsx)(ne,{title:t(`No revenue`),description:t(`Nothing matches this period and filters.`)})}),Ue.map(([e,n])=>(0,S.jsxs)(`section`,{children:[(0,S.jsxs)(`div`,{className:`flex items-baseline justify-between px-1 mb-1.5`,children:[(0,S.jsx)(`span`,{className:`label`,children:T(e,`long`)}),(0,S.jsx)(`span`,{className:`num text-[12px] text-ink-3`,children:E(n.reduce((e,t)=>e+t.amountMinor,0))})]}),(0,S.jsx)(`ul`,{className:`card divide-y divide-line overflow-hidden`,children:n.map(e=>(0,S.jsxs)(`li`,{children:[(0,S.jsxs)(`button`,{type:`button`,onClick:()=>V?Z(e.id):G(e),className:i(`pressable w-full flex items-center gap-3 px-4 py-3 text-start`,z.has(e.id)&&`bg-accent-soft/50`),children:[V?(0,S.jsx)(`span`,{className:i(`size-6 rounded-full border-2 inline-flex items-center justify-center shrink-0`,z.has(e.id)?`bg-accent border-accent text-white`:`border-line-strong`),children:z.has(e.id)&&(0,S.jsx)(ye,{className:`size-3.5`})}):(0,S.jsx)(`span`,{className:`inline-flex items-center justify-center size-10 rounded-[12px] shrink-0`,style:{background:`${e.category?.color??`var(--s-revenue)`}1f`},children:(0,S.jsx)(a,{color:e.category?.color??`var(--s-revenue)`,size:10})}),(0,S.jsxs)(`span`,{className:`flex-1 min-w-0`,children:[(0,S.jsxs)(`span`,{dir:`auto`,className:`block text-[15px] font-medium truncate`,children:[e.pos&&(0,S.jsx)(`span`,{className:`inline-block size-1.5 rounded-full bg-[#1e9e6a] me-1.5 align-middle`,title:`Loyverse`}),e.description]}),(0,S.jsxs)(`span`,{className:`block text-[12.5px] text-ink-3 truncate`,children:[e.payments.filter(e=>e.amountMinor>0).length?e.payments.filter(e=>e.amountMinor>0).map(e=>`${C(e)} ${E(e.amountMinor,{compact:!0})}`).join(` · `):e.category?r(e.category):t(`Uncategorised`),e.receivedBy?` · ${r(e.receivedBy)}`:``]})]}),(0,S.jsx)(y,{minor:e.amountMinor,tone:`revenue`,className:`text-[15px] font-semibold shrink-0`})]}),!V&&q.some(t=>!e.payments.some(e=>e.paymentMethodId===t.id&&e.amountMinor>0))&&(0,S.jsx)(`div`,{className:`flex gap-1.5 overflow-x-auto px-4 pb-2.5 -mt-1 [scrollbar-width:none]`,children:q.filter(t=>!e.payments.some(e=>e.paymentMethodId===t.id&&e.amountMinor>0)).map(t=>(0,S.jsxs)(`button`,{type:`button`,onClick:()=>K({kind:`revenue`,entry:e,method:t}),className:`pressable inline-flex items-center gap-1 h-7 px-2.5 rounded-full border border-line text-[12.5px] font-medium text-ink-2 whitespace-nowrap hover:border-accent hover:text-accent`,children:[(0,S.jsx)(g,{className:`size-3`}),` `,r(t)]},t.id))})]},e.id))})]},e)),M.data&&(0,S.jsx)(`div`,{className:`card`,children:(0,S.jsx)(u,{page:M.data.page,pageSize:M.data.pageSize,total:M.data.total,onPage:e=>D.set({page:String(e)})})})]}):(0,S.jsxs)(s,{flush:!0,children:[(0,S.jsxs)(me,{children:[(0,S.jsx)(`thead`,{children:(0,S.jsxs)(`tr`,{children:[V&&(0,S.jsx)(c,{className:`w-10`,children:(0,S.jsx)(h,{checked:X,onChange:Ve,"aria-label":t(`Select all`)})}),(0,S.jsx)(c,{sortable:!0,sorted:$(`date`),onSort:()=>Q(`date`),className:`w-28`,children:t(`Date`)}),(0,S.jsx)(c,{sortable:!0,sorted:$(`description`),onSort:()=>Q(`description`),children:t(`Description`)}),(0,S.jsx)(c,{children:t(`Category`)}),(0,S.jsx)(c,{children:t(`Source`)}),(0,S.jsx)(c,{children:t(`Received by`)}),Y.map(e=>(0,S.jsx)(c,{align:e.type===`money`||e.type===`number`?`right`:`left`,children:o(e)},e.id)),q.map(e=>(0,S.jsx)(c,{align:`right`,children:(0,S.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,S.jsx)(a,{color:e.color}),r(e)]})},e.id)),(0,S.jsx)(c,{align:`right`,sortable:!0,sorted:$(`amountMinor`),onSort:()=>Q(`amountMinor`),className:`w-36`,children:q.length?t(`Total`):t(`Amount`)}),(0,S.jsx)(c,{className:`w-12`})]})}),(0,S.jsxs)(`tbody`,{children:[M.isPending&&(0,S.jsx)(he,{colSpan:8+Y.length+q.length,children:t(`Loading…`)}),!M.isPending&&!J.length&&(0,S.jsx)(he,{colSpan:8+Y.length+q.length,children:t(`No revenue in this period.`)}),J.map(e=>(0,S.jsxs)(pe,{selected:z.has(e.id),className:`cursor-pointer`,onClick:()=>V?Z(e.id):G(e),children:[V&&(0,S.jsx)(l,{onClick:e=>e.stopPropagation(),children:(0,S.jsx)(h,{checked:z.has(e.id),onChange:()=>Z(e.id),"aria-label":t(`Select`)})}),(0,S.jsx)(l,{className:`num text-ink-2 whitespace-nowrap`,children:T(e.date)}),(0,S.jsxs)(l,{children:[(0,S.jsx)(`div`,{dir:`auto`,className:`font-medium truncate max-w-[380px]`,children:e.description}),e.recurringRuleId&&(0,S.jsx)(`div`,{className:`text-[12px] text-ink-3`,children:t(`recurring`)}),e.pos&&(0,S.jsx)(`div`,{className:`text-[12px] text-ink-3`,children:t(`Loyverse shift · {n} receipts`,{n:e.pos.receipts})})]}),(0,S.jsx)(l,{children:e.category?(0,S.jsx)(te,{color:e.category.color,children:r(e.category)}):(0,S.jsx)(`span`,{className:`text-ink-4`,children:`—`})}),(0,S.jsx)(l,{className:`text-ink-2`,children:e.source??(0,S.jsx)(`span`,{className:`text-ink-4`,children:`—`})}),(0,S.jsx)(l,{children:e.receivedBy?(0,S.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,S.jsx)(re,{name:r(e.receivedBy),color:e.receivedBy.color,size:22}),r(e.receivedBy)]}):(0,S.jsx)(`span`,{className:`text-ink-3`,children:t(`Company`)})}),Y.map(t=>(0,S.jsx)(l,{align:t.type===`money`||t.type===`number`?`right`:`left`,children:(0,S.jsx)(b,{def:t,value:e.customFields?.[t.key]})},t.id)),q.map(n=>{let i=e.payments.find(e=>e.paymentMethodId===n.id);return(0,S.jsx)(l,{align:`right`,onClick:e=>e.stopPropagation(),children:i&&i.amountMinor>0?(0,S.jsx)(`button`,{type:`button`,className:`num hover:text-accent`,title:t(`Edit {method} amount`,{method:r(n)}),onClick:()=>K({kind:`revenue`,entry:e,method:n}),children:E(i.amountMinor)}):(0,S.jsxs)(`button`,{type:`button`,className:`inline-flex items-center gap-1 text-[12.5px] font-medium text-accent/80 hover:text-accent whitespace-nowrap`,onClick:()=>K({kind:`revenue`,entry:e,method:n}),children:[(0,S.jsx)(g,{className:`size-3.5`}),t(`Add {method}`,{method:r(n)})]})},n.id)}),(0,S.jsx)(l,{align:`right`,children:(0,S.jsx)(y,{minor:e.amountMinor,className:`font-semibold`})}),(0,S.jsx)(l,{onClick:e=>e.stopPropagation(),children:(0,S.jsx)(ve,{trigger:()=>(0,S.jsx)(`button`,{type:`button`,className:`size-8 inline-flex items-center justify-center rounded-full text-ink-3 hover:text-ink hover:bg-card-hover`,"aria-label":t(`Actions`),children:(0,S.jsx)(p,{className:`size-4`})}),children:n=>(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(f,{icon:(0,S.jsx)(_e,{}),onClick:()=>{n(),I(e)},children:t(`Edit`)}),(0,S.jsx)(m,{}),(0,S.jsx)(f,{icon:(0,S.jsx)(d,{}),danger:!0,onClick:()=>{n(),R(e)},children:t(`Delete`)})]})})})]},e.id))]})]}),M.data&&(0,S.jsx)(u,{page:M.data.page,pageSize:M.data.pageSize,total:M.data.total,onPage:e=>D.set({page:String(e)})})]}),(0,S.jsx)(Ae,{open:!!W,onClose:()=>G(null),title:W?.description??``,description:W?`${T(W.date,`long`)} · ${W.category?r(W.category):t(`Uncategorised`)}`:``,width:460,footer:W&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(_,{variant:`danger`,size:`md`,onClick:()=>R(W),children:t(`Delete`)}),(0,S.jsx)(_,{variant:`primary`,size:`md`,onClick:()=>{I(W),G(null)},children:t(`Edit`)})]}),children:W&&(0,S.jsxs)(`div`,{className:`space-y-4`,children:[(0,S.jsx)(`div`,{className:`num text-[32px] font-semibold tracking-tight text-revenue`,children:E(W.amountMinor)}),(0,S.jsxs)(`dl`,{className:`grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 text-[14px]`,children:[W.payments.filter(e=>e.amountMinor>0).map(e=>(0,S.jsxs)(`span`,{className:`contents`,children:[(0,S.jsx)(`dt`,{className:`text-ink-3`,children:C(e)}),(0,S.jsx)(`dd`,{className:`num`,children:E(e.amountMinor)})]},e.paymentMethodId)),(0,S.jsx)(`dt`,{className:`text-ink-3`,children:t(`Received by`)}),(0,S.jsx)(`dd`,{className:`font-medium`,children:W.receivedBy?r(W.receivedBy):t(`Company account`)}),W.source&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`dt`,{className:`text-ink-3`,children:t(`Source`)}),(0,S.jsx)(`dd`,{children:W.source})]}),Y.map(e=>(0,S.jsxs)(`span`,{className:`contents`,children:[(0,S.jsx)(`dt`,{className:`text-ink-3`,children:o(e)}),(0,S.jsx)(`dd`,{children:(0,S.jsx)(b,{def:e,value:W.customFields?.[e.key]})})]},e.id)),W.notes&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`dt`,{className:`text-ink-3`,children:t(`Notes`)}),(0,S.jsx)(`dd`,{className:`whitespace-pre-wrap`,children:W.notes})]})]}),W.pos&&(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2 mb-2`,children:[(0,S.jsx)(ee,{tone:`revenue`,children:`Loyverse`}),(0,S.jsx)(`span`,{className:`text-[12.5px] text-ink-3`,children:t(`What sold this shift`)})]}),(0,S.jsx)(je,{shiftId:W.pos.shiftId})]})]})}),(0,S.jsx)(Ee,{open:F!==void 0,onClose:()=>I(void 0),revenue:F??null}),(0,S.jsx)(Se,{target:Be,onClose:()=>K(null)}),(0,S.jsx)(we,{open:Le,onClose:()=>j(!1)}),(0,S.jsx)(Oe,{open:!!L,onClose:()=>R(null),onConfirm:async()=>{try{await N.mutateAsync(L.id),O.success(t(`Revenue deleted`)),R(null),G(null)}catch(e){O.error(t(`Delete failed`),v(e))}},loading:N.isPending,title:t(`Delete this revenue entry?`),description:L?t(`{description} · {amount} on {date}`,{description:L.description,amount:E(L.amountMinor),date:T(L.date)}):``}),(0,S.jsx)(Oe,{open:ze,onClose:()=>U(!1),onConfirm:async()=>{try{await P.mutateAsync([...z]),O.success(t(`{n} entries deleted`,{n:z.size})),B(new Set),H(!1),U(!1)}catch(e){O.error(t(`Delete failed`),v(e))}},loading:P.isPending,title:t(`Delete {n} entries?`,{n:z.size}),description:t(`This cannot be undone.`)})]})}export{C as RevenuePage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as e}from"./badge-DCLlsDNI.js";var t={name:`refresh-cw`,size:24,node:[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]};t.node;var n=e(t),r={name:`search`,size:24,node:[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]};r.node;var i=e(r);export{n,i as t};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{L as e,T as t,_t as n,b as r,c as i,d as a,ft as o,g as s,h as c,l,mt as u,n as d,o as f,p,s as m,v as h,x as g}from"./badge-DCLlsDNI.js";import{o as _,s as v,t as y,y as b}from"./queries-CxLQqNqz.js";import{n as x}from"./project-CYHaWZqH.js";import{n as S}from"./table-QAdUTXQz.js";import{a as C,i as w,n as T,o as E,r as D,t as O}from"./menu-C-8r2BNA.js";import{a as k,c as A,i as j,n as M,o as ee,r as N,s as te}from"./media-D6XgVZ7M.js";import{D as ne,b as re,f as P,h as F,l as I,m as L,n as R,r as ie,t as ae,u as oe}from"./index-B9WjaP25.js";import{n as se}from"./format-GDcQVAp4.js";var z={name:`arrow-down`,size:24,node:[[`path`,{d:`M12 5v14`,key:`s699le`}],[`path`,{d:`m19 12-7 7-7-7`,key:`1idqje`}]]};z.node;var ce=s(z),B={name:`arrow-up`,size:24,node:[[`path`,{d:`m5 12 7-7 7 7`,key:`hav0vg`}],[`path`,{d:`M12 19V5`,key:`x0mq9r`}]]};B.node;var le=s(B),V={name:`image-plus`,size:24,node:[[`path`,{d:`M16 5h6`,key:`1vod17`}],[`path`,{d:`M19 2v6`,key:`4bpg5p`}],[`path`,{d:`M21 11.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7.5`,key:`1ue2ih`}],[`path`,{d:`m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21`,key:`1xmnt7`}],[`circle`,{cx:`9`,cy:`9`,r:`2`,key:`af1f0g`}]]};V.node;var H=s(V),U={name:`rotate-ccw`,size:24,node:[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}]]};U.node;var W=s(U),G={name:`share`,size:24,node:[[`path`,{d:`M12 2v13`,key:`1km8f5`}],[`path`,{d:`m16 6-4-4-4 4`,key:`13yo43`}],[`path`,{d:`M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8`,key:`1b2hhj`}]]};G.node;var ue=s(G),K={name:`smartphone`,size:24,node:[[`rect`,{width:`14`,height:`20`,x:`5`,y:`2`,rx:`2`,ry:`2`,key:`1yt0o3`}],[`path`,{d:`M12 18h.01`,key:`mhygvu`}]]};K.node;var de=s(K),q=n(u(),1),J=null;typeof window<`u`&&window.addEventListener(`beforeinstallprompt`,e=>{e.preventDefault(),J=e,window.dispatchEvent(new Event(`ledgr:installable`))});function fe(){let[e,t]=(0,q.useState)(!!J),[n,r]=(0,q.useState)(!1);return(0,q.useEffect)(()=>{let e=()=>t(!0),n=()=>{r(!0),t(!1)};return window.addEventListener(`ledgr:installable`,e),window.addEventListener(`appinstalled`,n),()=>{window.removeEventListener(`ledgr:installable`,e),window.removeEventListener(`appinstalled`,n)}},[]),{canInstall:e,install:async()=>{if(!J)return;await J.prompt();let{outcome:e}=await J.userChoice;e===`accepted`&&r(!0),J=null,t(!1)},installed:n,isIOS:/iphone|ipad|ipod/i.test(navigator.userAgent),isStandalone:window.matchMedia(`(display-mode: standalone)`).matches||navigator.standalone===!0}}var Y=o(),pe={text:`Text`,number:`Number`,money:`Money`,date:`Date`,boolean:`Yes / no`,select:`Select (options)`},me={expense:`New expense field`,revenue:`New revenue field`,stakeholder:`New stakeholder field`};function he({open:t,onClose:n,field:r,entity:i}){let a=F(),{t:o}=h(),{create:s,update:c}=_(),[l,u]=(0,q.useState)(``),[d,f]=(0,q.useState)(``),[p,m]=(0,q.useState)(``),[v,y]=(0,q.useState)(!1),[b,x]=(0,q.useState)(`text`),[S,C]=(0,q.useState)(``),[w,T]=(0,q.useState)(!1);(0,q.useEffect)(()=>{t&&(u(r?.label??``),f(r?.labelAr??``),m(r?.key??``),y(!!r),x(r?.type??`text`),C(r?.options.join(`
|
|
2
|
+
`)??``),T(r?.required??!1))},[t,r]),(0,q.useEffect)(()=>{v||m(e(l))},[l,v]);let E=S.split(`
|
|
3
|
+
`).map(e=>e.trim()).filter(Boolean),D=l.trim()&&/^[a-z][a-z0-9_]*$/.test(p)&&(b!==`select`||E.length>0),O=s.isPending||c.isPending,A=async()=>{try{if(r)await c.mutateAsync({id:r.id,label:l.trim(),labelAr:d.trim()||null,type:b,options:E,required:w});else{let e={entity:i,key:p,label:l.trim(),labelAr:d.trim()||null,type:b,options:E,required:w};await s.mutateAsync(e)}a.success(o(r?`Field updated`:`Field added`)),n()}catch(e){a.error(o(`Could not save field`),L(e))}};return(0,Y.jsx)(oe,{open:t,onClose:n,title:o(r?`Edit custom field`:me[i]),footer:(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(P,{variant:`ghost`,size:`md`,onClick:n,children:o(`Cancel`)}),(0,Y.jsx)(P,{variant:`primary`,size:`md`,onClick:A,loading:O,disabled:!D,children:o(r?`Save`:`Add field`)})]}),children:(0,Y.jsxs)(`form`,{className:`space-y-4`,onSubmit:e=>{e.preventDefault(),D&&A()},children:[(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,Y.jsx)(N,{label:o(`Label`),required:!0,children:(0,Y.jsx)(j,{value:l,onChange:e=>u(e.target.value),autoFocus:!0,placeholder:o(`Invoice no.`)})}),(0,Y.jsx)(N,{label:o(`Key`),hint:o(`CSV column id`),children:(0,Y.jsx)(j,{mono:!0,value:p,disabled:!!r,onChange:e=>{y(!0),m(e.target.value)}})})]}),(0,Y.jsx)(N,{label:o(`Arabic label`),hint:o(`optional`),children:(0,Y.jsx)(j,{lang:`ar`,dir:`rtl`,value:d,onChange:e=>f(e.target.value)})}),(0,Y.jsx)(N,{label:o(`Type`),children:(0,Y.jsx)(k,{value:b,onChange:e=>x(e.target.value),children:g.map(e=>(0,Y.jsx)(`option`,{value:e,children:o(pe[e])},e))})}),b===`select`&&(0,Y.jsx)(N,{label:o(`Options`),hint:o(`one per line`),children:(0,Y.jsx)(ee,{value:S,onChange:e=>C(e.target.value),placeholder:[o(`Direct`),`Upwork`,o(`Referral`)].join(`
|
|
4
|
+
`)})}),(0,Y.jsx)(M,{label:o(`Required`),checked:w,onChange:e=>T(e.target.checked)}),r&&r.type!==b&&(0,Y.jsx)(`p`,{className:`text-[11.5px] text-warning`,children:o(`Changing the type does not convert existing values; incompatible ones are shown as blank.`)})]})})}function ge(){let[e,t]=(0,q.useState)(`project`),{t:n}=h();return(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(a,{title:n(`Settings`)}),(0,Y.jsx)(p,{className:`mb-4`,value:e,onChange:t,items:[{id:`project`,label:n(`Project`)},{id:`branding`,label:n(`Branding`)},{id:`phone`,label:n(`Phone`)},{id:`fields`,label:n(`Custom fields`)},{id:`audit`,label:n(`Audit log`)}]}),e===`project`&&(0,Y.jsx)(ye,{}),e===`branding`&&(0,Y.jsx)(xe,{}),e===`phone`&&(0,Y.jsx)(Ce,{}),e===`fields`&&(0,Y.jsx)(Ee,{}),e===`audit`&&(0,Y.jsx)(De,{})]})}var _e=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],ve=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`];function ye(){let{project:e}=x(),{update:t}=b(),n=F(),{t:r}=h(),i=e.config,[a,o]=(0,q.useState)(i.name),[s,c]=(0,q.useState)(i.nameAr??``),[l,u]=(0,q.useState)(i.currency),[p,m]=(0,q.useState)(i.locale),[g,_]=(0,q.useState)(i.weekStartsOn),[v,y]=(0,q.useState)(i.fiscalYearStartMonth);(0,q.useEffect)(()=>{o(i.name),c(i.nameAr??``),u(i.currency),m(i.locale),_(i.weekStartsOn),y(i.fiscalYearStartMonth)},[i]);let S=a!==i.name||s!==(i.nameAr??``)||l!==i.currency||p!==i.locale||g!==i.weekStartsOn||v!==i.fiscalYearStartMonth,C=async()=>{try{await t.mutateAsync({name:a.trim(),nameAr:s.trim(),currency:l.toUpperCase(),locale:p,weekStartsOn:g,fiscalYearStartMonth:v}),n.success(r(`Project updated`))}catch(e){n.error(r(`Could not save`),L(e))}};return(0,Y.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-4`,children:[(0,Y.jsx)(f,{className:`xl:col-span-2`,title:r(`Project`),children:(0,Y.jsxs)(`form`,{className:`space-y-4 max-w-lg`,onSubmit:e=>{e.preventDefault(),C()},children:[(0,Y.jsx)(N,{label:r(`Name`),children:(0,Y.jsx)(j,{value:a,onChange:e=>o(e.target.value)})}),(0,Y.jsx)(N,{label:r(`Arabic name`),hint:r(`optional`),children:(0,Y.jsx)(j,{lang:`ar`,dir:`rtl`,value:s,onChange:e=>c(e.target.value)})}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,Y.jsx)(N,{label:r(`Currency`),hint:`ISO 4217`,children:(0,Y.jsx)(j,{mono:!0,maxLength:3,value:l,onChange:e=>u(e.target.value.toUpperCase())})}),(0,Y.jsx)(N,{label:r(`Locale`),hint:r(`formatting`),children:(0,Y.jsx)(j,{mono:!0,value:p,onChange:e=>m(e.target.value),placeholder:`en-US`})})]}),(0,Y.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,Y.jsx)(N,{label:r(`Week starts on`),children:(0,Y.jsx)(k,{value:g,onChange:e=>_(Number(e.target.value)),children:_e.map((e,t)=>(0,Y.jsx)(`option`,{value:t,children:r(e)},e))})}),(0,Y.jsx)(N,{label:r(`Fiscal year starts`),children:(0,Y.jsx)(k,{value:v,onChange:e=>y(Number(e.target.value)),children:ve.map((e,t)=>(0,Y.jsx)(`option`,{value:t+1,children:r(e)},e))})})]}),l!==i.currency&&(0,Y.jsx)(`p`,{className:`text-[13px] text-warning`,children:r(`Changing currency relabels amounts; it does not convert them.`)}),(0,Y.jsx)(P,{type:`submit`,variant:`primary`,size:`md`,disabled:!S,loading:t.isPending,children:r(`Save changes`)})]})}),(0,Y.jsxs)(`div`,{className:`space-y-4`,children:[(0,Y.jsx)(f,{title:r(`Appearance`),children:(0,Y.jsxs)(`div`,{className:`space-y-3`,children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`div`,{className:`label mb-1.5`,children:r(`Theme`)}),(0,Y.jsx)(ie,{})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`div`,{className:`label mb-1.5`,children:r(`Language`)}),(0,Y.jsx)(ae,{})]})]})}),(0,Y.jsxs)(f,{title:r(`About this project`),children:[(0,Y.jsxs)(`dl`,{className:`grid grid-cols-[auto_1fr] gap-x-5 gap-y-2 text-[13.5px]`,children:[(0,Y.jsx)(`dt`,{className:`text-ink-3`,children:r(`Auth`)}),(0,Y.jsx)(`dd`,{children:i.auth.mode===`supabase`?(0,Y.jsx)(d,{tone:`good`,children:r(`Supabase · admins only`)}):(0,Y.jsx)(d,{tone:`warning`,children:r(`None · local only`)})}),(0,Y.jsx)(`dt`,{className:`text-ink-3`,children:r(`Entries`)}),(0,Y.jsx)(`dd`,{className:`num`,children:r(`{expenses} expenses · {revenue} revenue`,{expenses:e.stats.expenses,revenue:e.stats.revenue})}),(0,Y.jsx)(`dt`,{className:`text-ink-3`,children:r(`Period`)}),(0,Y.jsx)(`dd`,{className:`num`,children:r(`{from} → {to}`,{from:e.stats.firstEntryDate??`—`,to:e.stats.lastEntryDate??`—`})}),(0,Y.jsx)(`dt`,{className:`text-ink-3`,children:r(`Version`)}),(0,Y.jsxs)(`dd`,{className:`num`,children:[`ledgr `,e.version]})]}),(0,Y.jsxs)(`p`,{className:`text-[12.5px] text-ink-3 mt-3 leading-relaxed`,children:[r(`Data lives in`),` `,(0,Y.jsx)(`code`,{className:`mono`,children:`.ledgr/data.db`}),` `,r(`next to this project. Auth settings are in`),` `,(0,Y.jsx)(`code`,{className:`mono`,children:`.ledgr/config.json`}),r(`; restart after changing them.`)]})]})]})]})}var be=[`#15181e`,`#2f5bea`,`#1baf7a`,`#6250d6`,`#eb6834`,`#d03b3b`,`#0f766e`,`#b45309`];function xe(){let{project:e}=x(),{update:t}=b(),n=F(),{t:r,name:i}=h(),a=e.config.branding??{},[o,s]=(0,q.useState)(a),[l,u]=(0,q.useState)(!1),d=(0,q.useRef)(null);(0,q.useEffect)(()=>s(e.config.branding??{}),[e.config.branding]);let p=JSON.stringify(X(o))!==JSON.stringify(X(a)),m=i({name:e.config.name,nameAr:e.config.nameAr}),g=async e=>{if(e){u(!0);try{s(e=>({...e,logo:void 0}));let t=await ne(e);s(e=>({...e,logo:t}))}catch(e){n.error(r(`Could not use that image`),L(e))}finally{u(!1),d.current&&(d.current.value=``)}}},_=async()=>{try{await t.mutateAsync({branding:X(o)}),n.success(r(`Branding updated`))}catch(e){n.error(r(`Could not save`),L(e))}},v=o.primaryColor??``;return(0,Y.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-4`,children:[(0,Y.jsx)(f,{className:`xl:col-span-2`,title:r(`Branding`),subtitle:r(`Make the dashboard look like yours: logo, name and colour. Everyone who opens this project sees it.`),children:(0,Y.jsxs)(`form`,{className:`space-y-6 max-w-lg`,onSubmit:e=>{e.preventDefault(),_()},children:[(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`div`,{className:`label mb-2`,children:r(`Logo`)}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,Y.jsx)(`span`,{className:`size-16 rounded-[14px] bg-sunken border border-line inline-flex items-center justify-center overflow-hidden shrink-0`,children:o.logo?(0,Y.jsx)(`img`,{src:o.logo,alt:``,className:`size-full object-contain`}):(0,Y.jsx)(R,{size:40})}),(0,Y.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Y.jsx)(`input`,{ref:d,type:`file`,accept:`image/png,image/jpeg,image/webp,image/gif,image/svg+xml`,className:`hidden`,onChange:e=>g(e.target.files?.[0])}),(0,Y.jsx)(P,{type:`button`,variant:`soft`,size:`sm`,icon:(0,Y.jsx)(H,{className:`size-4`}),loading:l,onClick:()=>d.current?.click(),children:r(o.logo?`Replace logo`:`Upload logo`)}),o.logo&&(0,Y.jsx)(P,{type:`button`,variant:`ghost`,size:`sm`,icon:(0,Y.jsx)(A,{className:`size-4`}),onClick:()=>s(e=>({...e,logo:void 0})),children:r(`Remove`)})]})]}),(0,Y.jsx)(`p`,{className:`text-[12.5px] text-ink-3 mt-2`,children:r(`Square works best. PNG, JPEG, WebP, GIF or SVG; raster images are scaled down to 256 px.`)})]}),(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)(`div`,{className:`label mb-2`,children:r(`Primary colour`)}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 flex-wrap`,children:[be.map(e=>(0,Y.jsx)(`button`,{type:`button`,"aria-label":e,onClick:()=>s(t=>({...t,primaryColor:e})),className:c(`size-8 rounded-full border-2 transition-transform hover:scale-110`,v.toLowerCase()===e?`border-ink scale-110`:`border-transparent`),style:{background:e}},e)),(0,Y.jsxs)(`label`,{className:`relative size-8 rounded-full border border-line-strong overflow-hidden cursor-pointer shrink-0`,title:r(`Custom colour`),children:[(0,Y.jsx)(`input`,{type:`color`,value:v||`#2f5bea`,onChange:e=>s(t=>({...t,primaryColor:e.target.value})),className:`absolute inset-0 opacity-0 cursor-pointer`}),(0,Y.jsx)(`span`,{className:`absolute inset-0`,style:{background:`conic-gradient(red, yellow, lime, cyan, blue, magenta, red)`}})]}),(0,Y.jsx)(j,{mono:!0,compact:!0,className:`w-28`,placeholder:`#2f5bea`,maxLength:7,value:v,onChange:e=>{let t=e.target.value.trim();s(e=>({...e,primaryColor:t?t.startsWith(`#`)?t:`#${t}`:void 0}))}}),v&&(0,Y.jsx)(P,{type:`button`,variant:`ghost`,size:`sm`,icon:(0,Y.jsx)(W,{className:`size-4`}),onClick:()=>s(e=>({...e,primaryColor:void 0})),children:r(`Default`)})]}),(0,Y.jsx)(`p`,{className:`text-[12.5px] text-ink-3 mt-2`,children:r(`Used for buttons, links, focus rings and the default logo. Leave empty for ledgr's neutral look.`)}),v&&!/^#[0-9a-fA-F]{6}$/.test(v)&&(0,Y.jsx)(`p`,{className:`text-[12.5px] text-critical mt-1`,children:r(`Enter a 6-digit hex colour like #2f5bea.`)})]}),(0,Y.jsx)(te,{checked:!!o.showProjectName,onChange:e=>s(t=>({...t,showProjectName:e})),label:r(`Show the project name instead of “ledgr”`),description:r(`In the sidebar, the browser tab and on the sign-in screen.`)}),(0,Y.jsx)(P,{type:`submit`,variant:`primary`,size:`md`,disabled:!p||l||!!v&&!/^#[0-9a-fA-F]{6}$/.test(v),loading:t.isPending,children:r(`Save changes`)})]})}),(0,Y.jsxs)(f,{title:r(`Preview`),children:[(0,Y.jsx)(Se,{branding:o,projectName:m}),(0,Y.jsxs)(`p`,{className:`text-[12.5px] text-ink-3 mt-3 leading-relaxed`,children:[r(`The whole app switches to these colours once you save. Branding is stored in`),` `,(0,Y.jsx)(`code`,{className:`mono`,children:`.ledgr/config.json`}),` `,r(`and included in backups.`)]})]})]})}function X(e){let t={};return e.logo&&(t.logo=e.logo),e.primaryColor&&(t.primaryColor=e.primaryColor.toLowerCase()),e.showProjectName&&(t.showProjectName=!0),t}function Se({branding:e,projectName:t}){let{t:n}=h(),r=e.primaryColor&&/^#[0-9a-fA-F]{6}$/.test(e.primaryColor)?Z(e.primaryColor):void 0,i=e.showProjectName?t:`ledgr`;return(0,Y.jsxs)(`div`,{className:`rounded-[16px] border border-line bg-bg p-4 space-y-3`,style:r,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[e.logo?(0,Y.jsx)(`img`,{src:e.logo,alt:``,className:`size-[30px] rounded-[9px] object-contain`}):(0,Y.jsx)(R,{}),(0,Y.jsxs)(`div`,{className:`min-w-0 leading-tight`,children:[(0,Y.jsx)(`div`,{className:`text-[15px] font-semibold truncate`,children:i}),!e.showProjectName&&(0,Y.jsx)(`div`,{className:`text-[11.5px] text-ink-3 truncate`,children:t})]})]}),(0,Y.jsx)(`div`,{className:`h-9 rounded-[10px] bg-primary text-primary-ink text-[13px] font-semibold inline-flex items-center justify-center px-4 w-full`,children:n(`Add expense`)}),(0,Y.jsxs)(`div`,{className:`flex items-center justify-between text-[13px]`,children:[(0,Y.jsx)(`span`,{className:`text-accent font-medium`,children:n(`Overview`)}),(0,Y.jsx)(`span`,{className:`h-6 px-2 rounded-full bg-accent-soft text-accent text-[12px] font-medium inline-flex items-center`,children:n(`required`)})]})]})}function Z(e){let n=t(e);return{"--primary":n[`--brand`],"--primary-ink":n[`--brand-ink`],"--accent":n[`--brand-accent`],"--accent-soft":n[`--brand-soft`]}}function Ce(){let{canInstall:e,install:t,installed:n,isIOS:r,isStandalone:i}=fe(),{t:a}=h(),o=typeof window<`u`?window.location.origin:``;return(0,Y.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-4`,children:[(0,Y.jsx)(f,{className:`xl:col-span-2`,title:a(`Add ledgr to your home screen`),subtitle:a(`Works like an app: full screen, its own icon, quick-add shortcuts.`),children:(0,Y.jsxs)(`div`,{className:`space-y-4 text-[14px]`,children:[i&&(0,Y.jsx)(`div`,{className:`rounded-[14px] bg-good/10 p-4`,children:a(`You are already running ledgr as an installed app.`)}),!i&&e&&(0,Y.jsxs)(`div`,{className:`flex items-center gap-3 flex-wrap`,children:[(0,Y.jsx)(P,{variant:`primary`,size:`md`,icon:(0,Y.jsx)(de,{className:`size-4`}),onClick:t,children:a(`Install ledgr`)}),(0,Y.jsx)(`span`,{className:`text-ink-3 text-[13px]`,children:a(n?`Installed. Open it from your home screen.`:`One tap, no app store.`)})]}),!i&&!e&&(0,Y.jsx)(`ol`,{className:`space-y-3 list-decimal ps-5 text-ink-2 leading-relaxed`,children:r?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`li`,{children:[a(`Open this page in`),` `,(0,Y.jsx)(`strong`,{className:`text-ink`,children:`Safari`}),a(`, tap`),` `,(0,Y.jsx)(ue,{className:`inline size-4 -mt-0.5`}),` `,(0,Y.jsx)(`strong`,{className:`text-ink`,children:a(`Share`)}),`.`]}),(0,Y.jsxs)(`li`,{children:[a(`Choose`),` `,(0,Y.jsx)(`strong`,{className:`text-ink`,children:a(`Add to Home Screen`)}),a(`, then`),` `,(0,Y.jsx)(`strong`,{className:`text-ink`,children:a(`Add`)}),`.`]})]}):(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`li`,{children:[a(`Open this page in Chrome, tap the`),` `,(0,Y.jsx)(`strong`,{className:`text-ink`,children:a(`⋮ menu`)}),`.`]}),(0,Y.jsxs)(`li`,{children:[a(`Choose`),` `,(0,Y.jsx)(`strong`,{className:`text-ink`,children:a(`Add to Home screen`)}),` (`,a(`or`),` `,(0,Y.jsx)(`strong`,{className:`text-ink`,children:a(`Install app`)}),`).`]})]})}),(0,Y.jsxs)(`div`,{className:`rounded-[14px] border border-line p-4`,children:[(0,Y.jsx)(`div`,{className:`font-medium mb-1`,children:a(`Quick-add shortcuts`)}),(0,Y.jsxs)(`p`,{className:`text-ink-2 text-[13.5px] leading-relaxed`,children:[a(`On Android, long-press the installed icon to get the`),` `,(0,Y.jsx)(`strong`,{className:`text-ink`,children:a(`Add expense`)}),` `,a(`and`),` `,(0,Y.jsx)(`strong`,{className:`text-ink`,children:a(`Add revenue`)}),` `,a(`shortcuts.`),` `,a(`On iPhone, add these two links to your home screen the same way (Safari → Share → Add to Home Screen); each opens straight into the form, like a widget:`)]}),(0,Y.jsx)(`ul`,{className:`mt-3 space-y-2`,children:[{path:`/add/expense`,label:`Add expense`,color:`var(--s-expense)`},{path:`/add/revenue`,label:`Add revenue`,color:`var(--s-revenue)`}].map(e=>(0,Y.jsxs)(`li`,{className:`flex items-center justify-between gap-3 rounded-[12px] bg-sunken/60 px-3.5 py-2.5`,children:[(0,Y.jsxs)(`span`,{className:`inline-flex items-center gap-2.5 min-w-0`,children:[(0,Y.jsx)(`span`,{className:`size-7 rounded-[8px] inline-flex items-center justify-center text-white font-bold`,style:{background:e.color},children:`+`}),(0,Y.jsxs)(`span`,{className:`truncate`,children:[(0,Y.jsx)(`span`,{className:`font-medium`,children:a(e.label)}),` `,(0,Y.jsxs)(`span`,{className:`mono text-[12px] text-ink-3`,children:[o,e.path]})]})]}),(0,Y.jsx)(`a`,{href:e.path,className:`text-accent text-[13px] font-medium shrink-0`,children:a(`Open`)})]},e.path))}),(0,Y.jsx)(`p`,{className:`text-[12.5px] text-ink-3 mt-3`,children:a(`iPhone Shortcuts app users can also create a shortcut that opens one of these URLs and place it as a real home-screen widget.`)})]})]})}),(0,Y.jsx)(f,{title:a(`Why not a native widget?`),children:(0,Y.jsx)(`p`,{className:`text-[13.5px] text-ink-2 leading-relaxed`,children:a(`True home-screen widgets need a native iOS/Android app. ledgr is a web app that runs anywhere you host it, so it offers the next best thing: an installable app icon, OS-level shortcuts on Android, and single-purpose links that behave like widgets on iPhone.`)})})]})}var we={expense:`Expense`,revenue:`Revenue`,stakeholder:`Stakeholder`},Te={expense:`No custom fields on expenses`,revenue:`No custom fields on revenues`,stakeholder:`No custom fields on stakeholders`};function Ee(){let[e,t]=(0,q.useState)(`expense`),{t:n,label:a}=h(),o=v(e,!0),{remove:s,reorder:u}=_(),g=F(),[y,b]=(0,q.useState)(void 0),[x,S]=(0,q.useState)(null),k=(0,q.useMemo)(()=>[...o.data?.items??[]].sort((e,t)=>e.sortOrder-t.sortOrder),[o.data]),A=async(e,t)=>{let r=k.map(e=>e.id),i=e+t;if(!(i<0||i>=r.length)){[r[e],r[i]]=[r[i],r[e]];try{await u.mutateAsync(r)}catch(e){g.error(n(`Reorder failed`),L(e))}}};return(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`div`,{className:`flex items-center justify-between gap-3 mb-4`,children:[(0,Y.jsx)(p,{value:e,onChange:t,items:r.map(e=>({id:e,label:n(we[e])})),className:`md:w-auto`}),(0,Y.jsx)(P,{variant:`primary`,size:`sm`,className:`rounded-full shrink-0`,icon:(0,Y.jsx)(re,{className:`size-4`}),onClick:()=>b(null),children:n(`New field`)})]}),(0,Y.jsx)(f,{flush:!0,children:o.isPending?(0,Y.jsx)(l,{}):k.length?(0,Y.jsx)(`ul`,{className:`divide-y divide-line`,children:k.map((e,t)=>(0,Y.jsxs)(`li`,{className:c(`flex items-center`,e.archived&&`opacity-50`),children:[(0,Y.jsxs)(`div`,{className:`ps-3 flex flex-col`,children:[(0,Y.jsx)(`button`,{type:`button`,className:`size-7 inline-flex items-center justify-center rounded-full text-ink-3 hover:text-ink hover:bg-card-hover disabled:opacity-30`,disabled:t===0,onClick:()=>A(t,-1),"aria-label":n(`Move up`),children:(0,Y.jsx)(le,{className:`size-3.5`})}),(0,Y.jsx)(`button`,{type:`button`,className:`size-7 inline-flex items-center justify-center rounded-full text-ink-3 hover:text-ink hover:bg-card-hover disabled:opacity-30`,disabled:t===k.length-1,onClick:()=>A(t,1),"aria-label":n(`Move down`),children:(0,Y.jsx)(ce,{className:`size-3.5`})})]}),(0,Y.jsx)(i,{className:`flex-1`,title:(0,Y.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[a(e),e.required&&(0,Y.jsx)(d,{tone:`accent`,children:n(`required`)}),e.archived&&(0,Y.jsx)(d,{children:n(`archived`)})]}),subtitle:(0,Y.jsxs)(`span`,{children:[(0,Y.jsx)(`span`,{className:`mono`,children:e.key}),` · `,n(e.type),e.options.length?` · ${e.options.join(`, `)}`:``]}),onClick:()=>b(e)}),(0,Y.jsx)(`div`,{className:`pe-3`,children:(0,Y.jsx)(O,{trigger:()=>(0,Y.jsx)(`button`,{type:`button`,className:`size-9 inline-flex items-center justify-center rounded-full text-ink-3 hover:text-ink hover:bg-card-hover`,"aria-label":n(`Actions`),children:(0,Y.jsx)(E,{className:`size-4`})}),children:t=>(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(T,{icon:(0,Y.jsx)(C,{}),onClick:()=>{t(),b(e)},children:n(`Edit`)}),(0,Y.jsx)(D,{}),(0,Y.jsx)(T,{icon:(0,Y.jsx)(w,{}),danger:!0,onClick:()=>{t(),S(e)},children:n(`Delete`)})]})})})]},e.id))}):(0,Y.jsx)(m,{title:n(Te[e]),description:n(`Add columns like “Client”, “Invoice no.” or “Reimbursable”.`),action:(0,Y.jsx)(P,{variant:`soft`,onClick:()=>b(null),children:n(`Add a field`)})})}),(0,Y.jsx)(he,{open:y!==void 0,onClose:()=>b(void 0),field:y??null,entity:e}),(0,Y.jsx)(I,{open:!!x,onClose:()=>S(null),onConfirm:async()=>{try{await s.mutateAsync(x.id),g.success(n(`Field deleted`)),S(null)}catch(e){g.error(n(`Delete failed`),L(e))}},loading:s.isPending,title:n(`Delete field “{name}”?`,{name:x?a(x):``}),description:n(`Existing values stay in the records but are no longer shown or exported.`)})]})}function De(){let[e,t]=(0,q.useState)(1),[n,r]=(0,q.useState)(``),[i,a]=(0,q.useState)(``),o=y({page:e,pageSize:50,entity:n||void 0,action:i||void 0}),[s,c]=(0,q.useState)(null),{t:u}=h(),{locale:p}=x();return(0,Y.jsxs)(f,{title:u(`Audit log`),flush:!0,actions:(0,Y.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Y.jsxs)(k,{compact:!0,className:`w-36`,value:n,onChange:e=>{r(e.target.value),t(1)},children:[(0,Y.jsx)(`option`,{value:``,children:u(`All entities`)}),[`expense`,`revenue`,`stakeholder`,`category`,`settlement`,`customField`,`recurringRule`,`project`,`import`,`backup`].map(e=>(0,Y.jsx)(`option`,{value:e,children:u(e)},e))]}),(0,Y.jsxs)(k,{compact:!0,className:`w-32`,value:i,onChange:e=>{a(e.target.value),t(1)},children:[(0,Y.jsx)(`option`,{value:``,children:u(`All actions`)}),[`create`,`update`,`delete`,`import`,`settle`,`recompute`,`generate`,`restore`].map(e=>(0,Y.jsx)(`option`,{value:e,children:u(e)},e))]})]}),children:[o.isPending&&(0,Y.jsx)(l,{}),o.data&&!o.data.items.length&&(0,Y.jsx)(m,{title:u(`Nothing recorded yet`)}),(0,Y.jsx)(`ul`,{className:`divide-y divide-line`,children:o.data?.items.map(e=>(0,Y.jsx)(`li`,{children:(0,Y.jsxs)(`button`,{type:`button`,onClick:()=>c(s===e.id?null:e.id),className:`w-full text-start px-4 md:px-5 py-3 row-hover`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap text-[13.5px]`,children:[(0,Y.jsx)(d,{tone:e.action===`delete`?`critical`:e.action===`create`||e.action===`import`?`good`:`neutral`,children:u(e.action)}),(0,Y.jsx)(`span`,{className:`font-medium`,children:u(e.entity)}),(0,Y.jsx)(`span`,{className:`text-ink-3 truncate`,children:e.actorEmail}),(0,Y.jsx)(`span`,{className:`ms-auto text-ink-3 num text-[12.5px]`,title:new Date(e.at).toLocaleString(),children:se(e.at,p)})]}),(0,Y.jsx)(`div`,{className:`text-[12.5px] text-ink-3 mt-1 truncate`,children:Oe(e.before,e.after,u)}),s===e.id&&(0,Y.jsx)(`pre`,{className:`mono whitespace-pre-wrap max-h-64 overflow-auto text-[11.5px] bg-sunken rounded-[10px] p-3 mt-2`,children:JSON.stringify({before:e.before,after:e.after},null,2)})]})},e.id))}),o.data&&(0,Y.jsx)(S,{page:o.data.page,pageSize:o.data.pageSize,total:o.data.total,onPage:t})]})}function Oe(e,t,n){let r=e??{},i=t??{};if(!e&&t)return Q(i);if(e&&!t)return Q(r);let a=Object.keys({...r,...i}).filter(e=>JSON.stringify(r[e])!==JSON.stringify(i[e])&&![`updatedAt`,`splits`].includes(e));return a.length?a.map(e=>`${e}: ${$(r[e])} → ${$(i[e])}`).join(` · `):n(`no visible change`)}function Q(e){return[`description`,`name`,`label`,`amountMinor`,`date`,`inserted`,`count`].filter(t=>t in e).map(t=>`${t}: ${$(e[t])}`).join(` · `)||JSON.stringify(e).slice(0,120)}function $(e){return e==null?`∅`:typeof e==`object`?JSON.stringify(e).slice(0,40):String(e).slice(0,40)}export{ge as SettingsPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ft as e,h as t,m as n,n as r,v as i,y as a}from"./badge-DCLlsDNI.js";import{E as o}from"./queries-CxLQqNqz.js";import{n as s}from"./project-CYHaWZqH.js";import{t as c}from"./breakdown-B7xclB2-.js";var l=e();function u(e,t){return new Intl.NumberFormat(t,{maximumFractionDigits:Number.isInteger(e)?0:2}).format(e)}function d({sales:e,compact:n}){let{t:o}=i(),{money:d,locale:p}=s(),m=e.totals.netMinor,h=e.payments.filter(e=>e.pulled),g=e.payments.filter(e=>!e.pulled&&e.amountMinor!==0);return(0,l.jsxs)(`div`,{className:`space-y-4`,children:[(0,l.jsxs)(`div`,{className:`grid grid-cols-3 gap-2`,children:[(0,l.jsx)(f,{label:o(`Receipts`),value:`${e.totals.receipts}${e.totals.refunds?` · ${o(`{n} refunds`,{n:e.totals.refunds})}`:``}`}),(0,l.jsx)(f,{label:o(`Items sold`),value:u(e.totals.quantity,p)}),(0,l.jsx)(f,{label:o(`Net sales`),value:d(m,{compact:!0}),hint:e.totals.costMinor?o(`cost {amount}`,{amount:d(e.totals.costMinor,{compact:!0})}):void 0})]}),(h.length>0||g.length>0)&&(0,l.jsxs)(`div`,{className:`flex flex-wrap gap-1.5`,children:[h.map(e=>(0,l.jsxs)(r,{tone:`revenue`,children:[e.name,` · `,d(e.amountMinor,{compact:!0})]},e.paymentTypeId)),g.map(e=>(0,l.jsx)(`span`,{title:o(`Not pulled into the ledger`),children:(0,l.jsxs)(r,{className:`opacity-80`,children:[e.name,` · `,d(e.amountMinor,{compact:!0})]})},e.paymentTypeId))]}),e.payouts.length>0&&(0,l.jsxs)(`div`,{children:[(0,l.jsxs)(`div`,{className:`label mb-1.5`,children:[o(`Cash pay-outs`),` `,(0,l.jsxs)(`span`,{className:`num text-ink-3 font-normal normal-case tracking-normal`,children:[`−`,d(e.totals.paidOutMinor,{compact:!0}),e.totals.payoutsSubtracted?` · ${o(`taken off the cash amount`)}`:` · ${o(`not subtracted`)}`]})]}),(0,l.jsx)(`ul`,{className:`divide-y divide-line rounded-[12px] border border-line overflow-hidden`,children:e.payouts.map((e,t)=>(0,l.jsxs)(`li`,{className:`flex items-center gap-3 px-3 py-1.5 text-[13px]`,children:[(0,l.jsx)(`span`,{dir:`auto`,className:`flex-1 min-w-0 truncate`,children:e.comment??o(`Pay-out`)}),(0,l.jsxs)(`span`,{className:`num text-ink-2 shrink-0`,children:[`−`,d(e.amountMinor)]})]},t))})]}),e.byCategory.length>1&&(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`div`,{className:`label mb-2`,children:o(`By category`)}),(0,l.jsx)(c,{max:6,items:e.byCategory.map((e,t)=>({id:e.name||null,name:e.name||o(`Uncategorised`),color:a[t%a.length],amountMinor:e.netMinor,pct:e.pct,count:Math.round(e.quantity)})),emptyLabel:o(`No sales`)})]}),(0,l.jsx)(`div`,{className:`label`,children:o(`Items`)}),(0,l.jsxs)(`ul`,{className:t(`divide-y divide-line rounded-[12px] border border-line overflow-hidden`,n&&`max-h-[320px] overflow-y-auto`),children:[e.lines.map((e,t)=>(0,l.jsxs)(`li`,{className:`flex items-center gap-3 px-3 py-2`,children:[(0,l.jsxs)(`span`,{className:`num w-10 text-end text-[13px] text-ink-3 shrink-0`,children:[u(e.quantity,p),`×`]}),(0,l.jsxs)(`span`,{className:`flex-1 min-w-0`,children:[(0,l.jsxs)(`span`,{dir:`auto`,className:`block text-[13.5px] font-medium truncate`,children:[e.itemName,e.variantName?(0,l.jsxs)(`span`,{className:`text-ink-3 font-normal`,children:[` · `,e.variantName]}):null]}),e.categoryName&&(0,l.jsx)(`span`,{className:`block text-[11.5px] text-ink-3 truncate`,children:e.categoryName})]}),(0,l.jsxs)(`span`,{className:`text-end shrink-0`,children:[(0,l.jsx)(`span`,{className:`num block text-[13.5px] font-medium`,children:d(e.netMinor)}),m>0&&(0,l.jsxs)(`span`,{className:`num block text-[11px] text-ink-3`,children:[Math.round(e.netMinor/m*100),`%`]})]})]},`${e.externalItemId??e.itemName}-${e.variantName??``}-${t}`)),!e.lines.length&&(0,l.jsx)(`li`,{className:`px-3 py-6 text-center text-[13px] text-ink-3`,children:o(`No item lines on these receipts.`)})]})]})}function f({label:e,value:t,hint:n}){return(0,l.jsxs)(`div`,{className:`rounded-[12px] bg-sunken px-3 py-2 min-w-0`,children:[(0,l.jsx)(`div`,{className:`text-[11px] uppercase tracking-wide text-ink-3 truncate`,children:e}),(0,l.jsx)(`div`,{className:`num text-[15px] font-semibold truncate`,children:t}),n&&(0,l.jsx)(`div`,{className:`text-[11px] text-ink-3 truncate`,children:n})]})}function p({shiftId:e}){let{t}=i(),r=o(e);return r.isPending?(0,l.jsx)(`div`,{className:`py-6 flex justify-center`,children:(0,l.jsx)(n,{className:`size-5`})}):r.isError?(0,l.jsx)(`div`,{className:`text-[13px] text-ink-3`,children:t(`Could not load the shift sales.`)}):(0,l.jsx)(d,{sales:r.data,compact:!0})}export{d as n,u as r,p as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{B as e,F as t,_t as n,c as r,d as i,ft as a,g as o,h as s,l as c,mt as l,n as u,o as d,p as f,s as p,t as m,v as h,y as g}from"./badge-DCLlsDNI.js";import{D as _,O as v,T as y,c as b,n as x,s as S,w as C}from"./queries-CxLQqNqz.js";import{n as w}from"./project-CYHaWZqH.js";import{n as T}from"./table-QAdUTXQz.js";import{a as E,i as D,n as O,o as k,r as A,t as j}from"./menu-C-8r2BNA.js";import{i as M,o as N,r as P,s as F}from"./media-D6XgVZ7M.js";import{b as I,c as L,d as R,f as z,h as B,i as V,k as H,l as U,m as W,p as G,u as K}from"./index-B9WjaP25.js";import{t as q}from"./format-GDcQVAp4.js";import{t as J}from"./color-picker-DUPZPbk3.js";import{t as Y}from"./money-OFUBQ3gl.js";import{t as ee}from"./custom-cell-DOJAsRPW.js";var X={name:`arrow-right`,size:24,node:[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]};X.node;var Z=o(X),Q=n(l(),1),$=a();function te({open:t,onClose:n,stakeholder:r,suggestedShare:i}){let{t:a}=h(),o=B(),{create:s,update:c}=_(),[l,u]=(0,Q.useState)(``),[d,f]=(0,Q.useState)(``),[p,m]=(0,Q.useState)(``),[v,y]=(0,Q.useState)(`0`),[b,x]=(0,Q.useState)(!0),[S,C]=(0,Q.useState)(``),[w,T]=(0,Q.useState)(``),[E,D]=(0,Q.useState)(g[0]),[O,k]=(0,Q.useState)({}),[A,j]=(0,Q.useState)({});(0,Q.useEffect)(()=>{t&&(j({}),u(r?.name??``),f(r?.nameAr??``),m(r?.email??``),y(String(r?.sharePercent??i??0)),x(r?.active??!0),C(r?.joinedAt??``),T(r?.notes??``),D(r?.color??g[0]),k(r?.customFields??{}))},[t,r,i]);let I=Number(v),V=l.trim().length>0&&Number.isFinite(I)&&I>=0&&I<=100,H=s.isPending||c.isPending,U=async()=>{let t={name:l.trim(),nameAr:d.trim()||null,email:p.trim()||null,sharePercent:I,active:b,joinedAt:S||null,notes:w.trim()||null,color:E,customFields:O};try{r?await c.mutateAsync({id:r.id,...t}):await s.mutateAsync(t),o.success(a(r?`Stakeholder updated`:`Stakeholder added`)),n()}catch(t){t instanceof e&&t.code===`CUSTOM_FIELDS`&&Array.isArray(t.details)&&j(Object.fromEntries(t.details.map(e=>[e.key,e.message]))),o.error(a(`Could not save`),W(t))}};return(0,$.jsx)(R,{open:t,onClose:n,title:a(r?`Edit stakeholder`:`New stakeholder`),description:a(`Ownership share drives default expense splits and profit distribution.`),footer:(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(z,{variant:`ghost`,size:`md`,onClick:n,className:`max-md:hidden`,children:a(`Cancel`)}),(0,$.jsx)(z,{variant:`primary`,size:`lg`,onClick:U,loading:H,disabled:!V,className:`w-full md:w-auto`,children:a(r?`Save changes`:`Add stakeholder`)})]}),children:(0,$.jsxs)(`form`,{className:`space-y-4`,onSubmit:e=>{e.preventDefault(),V&&U()},children:[(0,$.jsxs)(`div`,{className:`grid grid-cols-[1fr_auto] gap-3 items-end`,children:[(0,$.jsx)(P,{label:a(`Name`),required:!0,children:(0,$.jsx)(M,{value:l,onChange:e=>u(e.target.value),autoFocus:!r})}),(0,$.jsx)(J,{value:E,onChange:D})]}),(0,$.jsx)(P,{label:a(`Arabic name`),hint:a(`optional`),children:(0,$.jsx)(M,{lang:`ar`,dir:`rtl`,value:d,onChange:e=>f(e.target.value)})}),(0,$.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,$.jsx)(P,{label:a(`Ownership share`),required:!0,hint:`%`,children:(0,$.jsx)(M,{mono:!0,type:`number`,step:`0.01`,min:0,max:100,value:v,onChange:e=>y(e.target.value)})}),(0,$.jsx)(P,{label:a(`Joined`),children:(0,$.jsx)(M,{mono:!0,type:`date`,value:S,onChange:e=>C(e.target.value)})})]}),(0,$.jsx)(P,{label:a(`Email`),children:(0,$.jsx)(M,{type:`email`,value:p,onChange:e=>m(e.target.value),placeholder:a(`Optional`)})}),(0,$.jsx)(F,{checked:b,onChange:x,label:a(`Active partner`),description:a(b?`Included in ownership splits and distribution`:`Kept for history, excluded from new splits`)}),(0,$.jsx)(P,{label:a(`Notes`),children:(0,$.jsx)(N,{value:w,onChange:e=>T(e.target.value),placeholder:a(`Optional`)})}),(0,$.jsx)(L,{entity:`stakeholder`,values:O,onChange:k,errors:A})]})})}function ne(){let{t:e}=h(),[n,r]=H(),a=n.get(`tab`)||`ownership`,o=e=>r(t=>{let n=new URLSearchParams(t);return n.set(`tab`,e),n.delete(`page`),n},{replace:!0}),c=v(),[l,u]=(0,Q.useState)(void 0),[d,p]=(0,Q.useState)({open:!1}),m=c.data?.shareTotal??0,g=t(100-m);return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(i,{title:e(`Stakeholders`),subtitle:c.data?(0,$.jsxs)($.Fragment,{children:[e(`{n} active partners`,{n:c.data.items.filter(e=>e.active).length}),` · `,e(`ownership`),` `,(0,$.jsx)(`span`,{className:s(`num font-medium`,Math.abs(g)>.01?`text-warning`:`text-ink`),children:q(m,2)})]}):e(`Loading…`),actions:(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(z,{variant:`secondary`,size:`sm`,className:`rounded-full`,icon:(0,$.jsx)(Z,{className:`size-4 rtl-flip`}),onClick:()=>p({open:!0}),children:e(`Record settlement`)}),(0,$.jsx)(z,{variant:`primary`,size:`sm`,className:`rounded-full`,icon:(0,$.jsx)(I,{className:`size-4`}),onClick:()=>u(null),children:e(`New stakeholder`)})]})}),c.data&&Math.abs(g)>.01&&c.data.items.length>0&&(0,$.jsxs)(`div`,{className:`mb-4 rounded-[14px] bg-warning/10 px-4 py-3 text-[13.5px]`,children:[e(`Ownership adds up to`),` `,(0,$.jsx)(`span`,{className:`num font-medium`,children:q(m,2)}),`. `,e(`Splits use the active total, but you probably want 100%.`),` `,g>0?e(`{pct}% is unassigned.`,{pct:g.toFixed(2)}):e(`It is {pct}% over.`,{pct:Math.abs(g).toFixed(2)})]}),(0,$.jsx)(f,{className:`mb-4`,value:a,onChange:o,items:[{id:`ownership`,label:e(`Ownership`)},{id:`balances`,label:e(`Balances`)},{id:`settlements`,label:e(`Settlements`)},{id:`distribution`,label:e(`Profit`)}]}),a===`ownership`&&(0,$.jsx)(re,{onEdit:e=>u(e)}),a===`balances`&&(0,$.jsx)(ie,{onSettle:e=>p({open:!0,prefill:e})}),a===`settlements`&&(0,$.jsx)(ae,{onEdit:e=>p({open:!0,settlement:e})}),a===`distribution`&&(0,$.jsx)(oe,{}),(0,$.jsx)(te,{open:l!==void 0,onClose:()=>u(void 0),stakeholder:l??null,suggestedShare:l===null?Math.max(0,g):void 0}),(0,$.jsx)(V,{open:d.open,onClose:()=>p({open:!1}),settlement:d.settlement,prefill:d.prefill})]})}function re({onEdit:e}){let{t,name:n,label:i}=h(),a=v(),o=S(`stakeholder`),{remove:s}=_(),l=B(),{date:f}=w(),[g,y]=(0,Q.useState)(null),[b,x]=(0,Q.useState)(!1),[C,T]=(0,Q.useState)(null),M=o.data?.items??[];if(a.isPending)return(0,$.jsx)(c,{});let N=a.data?.items??[],P=Math.max(a.data?.shareTotal??0,100);return(0,$.jsxs)($.Fragment,{children:[N.length>0&&(0,$.jsxs)(`div`,{className:`card p-4 md:p-5 mb-4`,children:[(0,$.jsx)(`div`,{className:`label mb-2`,children:t(`Cap table`)}),(0,$.jsx)(`div`,{className:`flex h-8 rounded-[10px] overflow-hidden bg-sunken gap-[2px]`,children:N.filter(e=>e.active&&e.sharePercent>0).map(e=>(0,$.jsx)(`div`,{className:`h-full flex items-center justify-center text-[12px] font-semibold text-white overflow-hidden`,style:{width:`${e.sharePercent/P*100}%`,background:e.color},title:`${n(e)} ${e.sharePercent}%`,children:(0,$.jsx)(`span`,{className:`truncate px-1.5`,children:e.sharePercent>=12?`${n(e).split(` `)[0]} ${e.sharePercent}%`:e.sharePercent>=6?`${e.sharePercent}%`:``})},e.id))})]}),(0,$.jsxs)(d,{flush:!0,children:[!N.length&&(0,$.jsx)(p,{title:t(`No stakeholders yet`),description:t(`Add the partners and their ownership percentage.`)}),(0,$.jsx)(`ul`,{className:`divide-y divide-line`,children:N.map(i=>(0,$.jsxs)(`li`,{className:`flex items-center`,children:[(0,$.jsx)(r,{className:`flex-1`,leading:(0,$.jsx)(m,{name:n(i),color:i.color,size:40}),title:(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[n(i),!i.active&&(0,$.jsx)(u,{children:t(`inactive`)})]}),subtitle:[i.email,i.joinedAt?t(`since {date}`,{date:f(i.joinedAt)}):null].filter(Boolean).join(` · `)||t(`No contact details`),trailing:(0,$.jsxs)(`span`,{className:`num text-[17px] font-semibold`,children:[i.sharePercent.toFixed(i.sharePercent%1?2:0),`%`]}),onClick:()=>T(i)}),(0,$.jsx)(`div`,{className:`pe-3`,children:(0,$.jsx)(j,{trigger:()=>(0,$.jsx)(`button`,{type:`button`,className:`size-9 inline-flex items-center justify-center rounded-full text-ink-3 hover:text-ink hover:bg-card-hover`,"aria-label":t(`Actions`),children:(0,$.jsx)(k,{className:`size-4`})}),children:n=>(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(O,{icon:(0,$.jsx)(E,{}),onClick:()=>{n(),e(i)},children:t(`Edit`)}),(0,$.jsx)(A,{}),(0,$.jsx)(O,{icon:(0,$.jsx)(D,{}),danger:!0,onClick:()=>{n(),x(!1),y(i)},children:t(`Remove`)})]})})})]},i.id))})]}),(0,$.jsx)(K,{open:!!C,onClose:()=>T(null),title:C?n(C):``,description:C?`${t(`{pct}% ownership`,{pct:C.sharePercent})} · ${C.active?t(`active`):t(`inactive`)}`:``,footer:C&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(z,{variant:`danger`,size:`md`,onClick:()=>{x(!1),y(C)},children:t(`Remove`)}),(0,$.jsx)(z,{variant:`primary`,size:`md`,onClick:()=>{e(C),T(null)},children:t(`Edit`)})]}),children:C&&(0,$.jsxs)(`dl`,{className:`grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 text-[14px]`,children:[(0,$.jsx)(`dt`,{className:`text-ink-3`,children:t(`Email`)}),(0,$.jsx)(`dd`,{children:C.email??`—`}),(0,$.jsx)(`dt`,{className:`text-ink-3`,children:t(`Joined`)}),(0,$.jsx)(`dd`,{children:C.joinedAt?f(C.joinedAt):`—`}),M.map(e=>(0,$.jsxs)(`span`,{className:`contents`,children:[(0,$.jsx)(`dt`,{className:`text-ink-3`,children:i(e)}),(0,$.jsx)(`dd`,{children:(0,$.jsx)(ee,{def:e,value:C.customFields?.[e.key]})})]},e.id)),C.notes&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`dt`,{className:`text-ink-3`,children:t(`Notes`)}),(0,$.jsx)(`dd`,{className:`whitespace-pre-wrap`,children:C.notes})]})]})}),(0,$.jsx)(U,{open:!!g,onClose:()=>y(null),onConfirm:async()=>{if(g)try{await s.mutateAsync({id:g.id,force:b}),l.success(t(`Stakeholder removed`)),y(null),x(!1),T(null)}catch(e){e.code===`HAS_RECORDS`&&x(!0),l.error(t(`Could not remove`),W(e))}},loading:s.isPending,confirmLabel:t(b?`Remove anyway`:`Remove`),title:t(`Remove {name}?`,{name:g?n(g):``}),description:t(b?`This stakeholder has expense splits, payments or settlements. Removing them deletes their split rows and un-assigns what they paid. Prefer marking them inactive.`:`If they have history you will be asked to confirm again. Consider marking them inactive instead.`)})]})}function ie({onSettle:e}){let{t,name:n}=h(),{range:r}=G(),{money:i}=w(),a=x(r.from,r.to);if(a.isPending)return(0,$.jsx)(c,{});if(a.isError)return(0,$.jsx)(p,{title:t(`Could not load balances`),description:a.error.message});let o=a.data,l=Math.max(1,...o.balances.map(e=>Math.abs(e.netMinor)));return(0,$.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-4`,children:[(0,$.jsxs)(d,{className:`xl:col-span-2`,title:t(`Who owes whom`),subtitle:t(`Expenses {total} in this period · company paid {pool}`,{total:i(o.totalExpenseMinor,{compact:!0}),pool:i(o.poolPaidMinor,{compact:!0})})+` · `+t(`Only expenses a partner paid out of pocket count here`),flush:!0,children:[(0,$.jsx)(`ul`,{className:`divide-y divide-line`,children:o.balances.map(e=>(0,$.jsxs)(`li`,{className:`px-4 md:px-5 py-3`,children:[(0,$.jsxs)(`div`,{className:`flex items-center gap-3`,children:[e.stakeholderId===`pool`?(0,$.jsx)(`span`,{className:`size-10 rounded-full border border-dashed border-line-strong inline-flex items-center justify-center text-[12px] text-ink-3 shrink-0`,children:t(`Co`)}):(0,$.jsx)(m,{name:n(e),color:e.color,size:40}),(0,$.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,$.jsxs)(`div`,{className:`text-[14.5px] font-medium truncate`,children:[e.stakeholderId===`pool`?t(e.name):n(e),e.stakeholderId!==`pool`&&(0,$.jsxs)(`span`,{className:`num text-[12.5px] text-ink-3 font-normal`,children:[` · `,e.sharePercent,`%`]})]}),(0,$.jsxs)(`div`,{className:`text-[12.5px] text-ink-3 truncate`,children:[t(`Share {share} · paid {paid}`,{share:i(e.owedMinor,{compact:!0}),paid:i(e.paidMinor,{compact:!0})}),e.settledOutMinor||e.settledInMinor?` · ${t(`settled {out} / {in}`,{out:i(e.settledOutMinor,{compact:!0}),in:i(e.settledInMinor,{compact:!0})})}`:``]})]}),(0,$.jsxs)(`div`,{className:`text-end shrink-0`,children:[(0,$.jsx)(Y,{minor:e.netMinor,tone:`flow`,signed:!0,className:`text-[15px] font-semibold block`}),(0,$.jsx)(`span`,{className:`text-[11.5px] text-ink-3`,children:e.netMinor>0?t(`is owed`):e.netMinor<0?t(`owes`):t(`settled`)})]})]}),(0,$.jsxs)(`div`,{className:`relative h-1.5 mt-2.5 ms-[52px]`,children:[(0,$.jsx)(`span`,{className:`absolute left-1/2 top-0 bottom-0 w-px bg-line-strong`}),(0,$.jsx)(`span`,{className:s(`absolute top-0 bottom-0 rounded-full`,e.netMinor>=0?`left-1/2 bg-good/70`:`right-1/2 bg-critical/70`),style:{width:`${Math.abs(e.netMinor)/l*50}%`}})]})]},e.stakeholderId))}),(0,$.jsx)(`p`,{className:`px-4 md:px-5 py-3 text-[12.5px] text-ink-3 border-t border-line`,children:t(`Net = paid − share of expenses + settlements paid − settlements received. The company row is the shared account. All rows sum to zero.`)})]}),(0,$.jsx)(d,{title:t(`Settle up`),subtitle:t(`Fewest transfers to clear everything`),flush:!0,children:o.suggestions.length?(0,$.jsx)(`ul`,{className:`divide-y divide-line`,children:o.suggestions.map((r,i)=>(0,$.jsxs)(`li`,{className:`px-4 md:px-5 py-3 flex items-center gap-3`,children:[(0,$.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,$.jsxs)(`div`,{className:`text-[14px] flex items-center gap-1.5 min-w-0`,children:[(0,$.jsx)(`span`,{className:`font-medium truncate`,children:r.fromStakeholderId===`pool`?t(r.fromName):n({name:r.fromName,nameAr:r.fromNameAr})}),(0,$.jsx)(Z,{className:`size-4 text-ink-3 shrink-0 rtl-flip`}),(0,$.jsx)(`span`,{className:`font-medium truncate`,children:r.toStakeholderId===`pool`?t(r.toName):n({name:r.toName,nameAr:r.toNameAr})})]}),(0,$.jsx)(Y,{minor:r.amountMinor,className:`text-[16px] font-semibold`})]}),(0,$.jsx)(z,{size:`sm`,variant:`soft`,className:`rounded-full`,onClick:()=>e(r),children:t(`Record`)})]},i))}):(0,$.jsx)(p,{title:t(`All square`),description:t(`Nobody owes anyone for this period.`)})})]})}function ae({onEdit:e}){let{t,name:n}=h(),{range:i}=G(),{date:a}=w(),[o,s]=H(),l=Number(o.get(`page`)??`1`)||1,u=y((0,Q.useMemo)(()=>({from:i.from,to:i.to,page:l,pageSize:50}),[i,l])),{remove:f}=C(),g=B(),[_,v]=(0,Q.useState)(null);return(0,$.jsxs)(d,{flush:!0,children:[u.isPending&&(0,$.jsx)(c,{}),u.data&&!u.data.items.length&&(0,$.jsx)(p,{title:t(`No settlements`),description:t(`Record one from the Balances tab when a partner pays someone back.`)}),(0,$.jsx)(`ul`,{className:`divide-y divide-line`,children:u.data?.items.map(i=>(0,$.jsxs)(`li`,{className:`flex items-center`,children:[(0,$.jsx)(r,{className:`flex-1`,leading:i.from&&(0,$.jsx)(m,{name:n(i.from),color:i.from.color,size:40}),title:(0,$.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[i.from?n(i.from):``,(0,$.jsx)(Z,{className:`size-4 text-ink-3 rtl-flip`}),i.to?n(i.to):t(`Company`)]}),subtitle:[a(i.date),i.note].filter(Boolean).join(` · `),trailing:(0,$.jsx)(Y,{minor:i.amountMinor,className:`text-[15px] font-semibold`})}),(0,$.jsx)(`div`,{className:`pe-3`,children:(0,$.jsx)(j,{trigger:()=>(0,$.jsx)(`button`,{type:`button`,className:`size-9 inline-flex items-center justify-center rounded-full text-ink-3 hover:text-ink hover:bg-card-hover`,"aria-label":t(`Actions`),children:(0,$.jsx)(k,{className:`size-4`})}),children:n=>(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(O,{icon:(0,$.jsx)(E,{}),onClick:()=>{n(),e(i)},children:t(`Edit`)}),(0,$.jsx)(A,{}),(0,$.jsx)(O,{icon:(0,$.jsx)(D,{}),danger:!0,onClick:()=>{n(),v(i)},children:t(`Delete`)})]})})})]},i.id))}),u.data&&(0,$.jsx)(T,{page:u.data.page,pageSize:u.data.pageSize,total:u.data.total,onPage:e=>s(t=>{let n=new URLSearchParams(t);return n.set(`page`,String(e)),n},{replace:!0})}),(0,$.jsx)(U,{open:!!_,onClose:()=>v(null),onConfirm:async()=>{try{await f.mutateAsync(_.id),g.success(t(`Settlement deleted`)),v(null)}catch(e){g.error(t(`Delete failed`),W(e))}},loading:f.isPending,title:t(`Delete this settlement?`)})]})}function oe(){let{t:e,name:t}=h(),{range:n}=G(),{money:r}=w(),i=b(n.from,n.to);if(i.isPending)return(0,$.jsx)(c,{});if(i.isError)return(0,$.jsx)(p,{title:e(`Could not load distribution`),description:i.error.message});let a=i.data;return(0,$.jsxs)(`div`,{className:`space-y-4`,children:[(0,$.jsx)(`div`,{className:`grid grid-cols-3 gap-3`,children:[{l:`Revenue`,v:a.revenueMinor,signed:!1},{l:`Expenses`,v:a.expenseMinor,signed:!1},{l:`Profit`,v:a.profitMinor,signed:!0}].map(t=>(0,$.jsxs)(`div`,{className:`card p-4`,children:[(0,$.jsx)(`div`,{className:`label`,children:e(t.l)}),(0,$.jsx)(`div`,{className:s(`num text-[18px] md:text-[22px] font-semibold mt-1 tracking-tight`,t.signed&&t.v<0&&`text-critical`),children:r(t.v,{signed:t.signed,compact:!0})})]},t.l))}),(0,$.jsxs)(d,{title:e(`Each partner's share`),subtitle:e(`By current ownership · shares total {pct}`,{pct:q(a.shareTotal,2)}),flush:!0,children:[(0,$.jsxs)(`ul`,{className:`divide-y divide-line`,children:[a.items.map(n=>(0,$.jsxs)(`li`,{className:`px-4 md:px-5 py-3 flex items-center gap-3`,children:[(0,$.jsx)(m,{name:t(n),color:n.color,size:40}),(0,$.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,$.jsxs)(`div`,{className:`text-[14.5px] font-medium truncate`,children:[t(n),` `,(0,$.jsxs)(`span`,{className:`num text-[12.5px] text-ink-3 font-normal`,children:[n.sharePercent,`%`]})]}),(0,$.jsx)(`div`,{className:`text-[12.5px] text-ink-3 truncate`,children:e(`Revenue {rev} · expenses {exp}`,{rev:r(n.revenueShareMinor,{compact:!0}),exp:r(n.expenseShareMinor,{compact:!0})})})]}),(0,$.jsxs)(`div`,{className:`text-end`,children:[(0,$.jsx)(Y,{minor:n.profitShareMinor,tone:`flow`,signed:!0,className:`text-[15px] font-semibold block`}),(0,$.jsx)(`span`,{className:`text-[11.5px] text-ink-3`,children:e(`profit share`)})]})]},n.stakeholderId)),!a.items.length&&(0,$.jsx)(`li`,{children:(0,$.jsx)(p,{title:e(`No active stakeholders`)})})]}),(0,$.jsx)(`p`,{className:`px-4 md:px-5 py-3 text-[12.5px] text-ink-3 border-t border-line`,children:e(`Uses current ownership shares for the selected period. Individual expense splits are snapshots and may differ if ownership changed.`)})]})]})}export{ne as StakeholdersPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as e}from"./badge-DCLlsDNI.js";var t={name:`archive-restore`,size:24,node:[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h2`,key:`tvwodi`}],[`path`,{d:`M20 8v11a2 2 0 0 1-2 2h-2`,key:`1gkqxj`}],[`path`,{d:`m9 15 3-3 3 3`,key:`1pd0qc`}],[`path`,{d:`M12 12v9`,key:`192myk`}]]};t.node;var n=e(t),r={name:`archive`,size:24,node:[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8`,key:`1s80jp`}],[`path`,{d:`M10 12h4`,key:`a56b0p`}]]};r.node;var i=e(r),a={name:`star`,size:24,node:[[`path`,{d:`M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z`,key:`r04s7s`}]]};a.node;var o=e(a);export{i as n,n as r,o as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ft as e,g as t,h as n,v as r}from"./badge-DCLlsDNI.js";var i={name:`chevron-down`,size:24,node:[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]};i.node;var a=t(i),o={name:`chevron-up`,size:24,node:[[`path`,{d:`m18 15-6-6-6 6`,key:`153udz`}]]};o.node;var s=t(o),c={name:`chevrons-up-down`,size:24,node:[[`path`,{d:`m7 15 5 5 5-5`,key:`1hf1tw`}],[`path`,{d:`m7 9 5-5 5 5`,key:`sgt6xg`}]]};c.node;var l=t(c),u=e();function d({className:e,children:t,...r}){return(0,u.jsx)(`div`,{className:`overflow-x-auto`,children:(0,u.jsx)(`table`,{className:n(`w-full border-collapse text-[14px]`,e),...r,children:t})})}function f({className:e,children:t,align:r=`left`,sortable:i,sorted:o,onSort:c,...d}){let f=o===`asc`?s:o===`desc`?a:l;return(0,u.jsx)(`th`,{className:n(`label h-10 px-4 border-b border-line bg-card sticky top-0 z-[1] whitespace-nowrap font-medium`,r===`right`&&`text-end`,r===`center`&&`text-center`,i&&`cursor-pointer select-none hover:text-ink`,e),onClick:i?c:void 0,"aria-sort":o?o===`asc`?`ascending`:`descending`:void 0,...d,children:(0,u.jsxs)(`span`,{className:n(`inline-flex items-center gap-1`,r===`right`&&`flex-row-reverse`),children:[t,i&&(0,u.jsx)(f,{className:n(`size-3.5`,o?`text-accent`:`text-ink-4`)})]})})}function p({className:e,children:t,align:r=`left`,...i}){return(0,u.jsx)(`td`,{className:n(`h-12 px-4 border-b border-line align-middle`,r===`right`&&`text-end`,r===`center`&&`text-center`,e),...i,children:t})}function m({className:e,selected:t,children:r,...i}){return(0,u.jsx)(`tr`,{className:n(`row-hover transition-colors last:[&>td]:border-b-0`,t&&`bg-accent-soft/60`,e),...i,children:r})}function h({colSpan:e,children:t}){return(0,u.jsx)(`tr`,{children:(0,u.jsx)(`td`,{colSpan:e,className:`h-36 text-center text-ink-3 text-[14px]`,children:t})})}function g({page:e,pageSize:t,total:n,onPage:i}){let{t:a}=r(),o=Math.max(1,Math.ceil(n/t)),s=n===0?0:(e-1)*t+1,c=Math.min(n,e*t);return n<=t?null:(0,u.jsxs)(`div`,{className:`flex items-center justify-between gap-3 px-4 h-12 border-t border-line text-[13px] text-ink-3`,children:[(0,u.jsx)(`span`,{className:`num`,children:a(`{from}–{to} of {total}`,{from:s,to:c,total:n})}),(0,u.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,u.jsx)(`button`,{type:`button`,className:`h-8 px-3 rounded-[9px] hover:bg-card-hover disabled:opacity-40 font-medium`,disabled:e<=1,onClick:()=>i(e-1),children:a(`Prev`)}),(0,u.jsxs)(`span`,{className:`num px-1`,children:[e,` / `,o]}),(0,u.jsx)(`button`,{type:`button`,className:`h-8 px-3 rounded-[9px] hover:bg-card-hover disabled:opacity-40 font-medium`,disabled:e>=o,onClick:()=>i(e+1),children:a(`Next`)})]})]})}export{f as a,p as i,g as n,m as o,d as r,a as s,h as t};
|