@masterteam/permissions 0.0.7 → 0.0.9

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.
@@ -1,2 +1,2 @@
1
- /*! tailwindcss v4.2.1 | 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-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight: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}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-gray-300:oklch(87.2% .01 258.338);--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--radius-lg:.5rem;--radius-2xl:1rem;--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,ui-sans-serif, system-ui, 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;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{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}}@layer components;@layer utilities{.\!absolute{position:absolute!important}.static{position:static}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-5{margin-block:calc(var(--spacing) * 5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.flex{display:flex}.h-full{height:100%}.\!w-\[24\%\]{width:24%!important}.w-1\/2{width:50%}.w-1\/5{width:20%}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}: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)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-lg{border-radius:var(--radius-lg)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.border,.border-1{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.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-gray-300{border-color:var(--color-gray-300)}.border-primary-400{border-color:var(--p-primary-400)}@supports (color:color-mix(in lab, red, red)){.border-primary-400{border-color:color-mix(in srgb, var(--p-primary-400) calc(100% * 1), transparent)}}.border-surface{border-color:var(--p-content-border-color)}.bg-primary-50{background-color:var(--p-primary-50)}@supports (color:color-mix(in lab, red, red)){.bg-primary-50{background-color:color-mix(in srgb, var(--p-primary-50) calc(100% * 1), transparent)}}.bg-surface-50{background-color:var(--p-surface-50)}@supports (color:color-mix(in lab, red, red)){.bg-surface-50{background-color:color-mix(in srgb, var(--p-surface-50) calc(100% * 1), transparent)}}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.px-4{padding-inline:calc(var(--spacing) * 4)}.pb-0{padding-bottom:calc(var(--spacing) * 0)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-muted-color{color:var(--p-text-muted-color)}.\!shadow-none{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.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))}@media (hover:hover){.hover\:bg-surface-100:hover{background-color:var(--p-surface-100)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-surface-100:hover{background-color:color-mix(in srgb, var(--p-surface-100) calc(100% * 1), transparent)}}}}@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0), var(--p-enter-translate-y,0), 0) scale3d(var(--p-enter-scale,1), var(--p-enter-scale,1), var(--p-enter-scale,1)) rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0), var(--p-leave-translate-y,0), 0) scale3d(var(--p-leave-scale,1), var(--p-leave-scale,1), var(--p-leave-scale,1)) rotate(var(--p-leave-rotate,0))}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{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}
1
+ /*! tailwindcss v4.2.2 | 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-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight: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}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-gray-300:oklch(87.2% .01 258.338);--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--radius-lg:.5rem;--radius-2xl:1rem;--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,ui-sans-serif, system-ui, 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;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{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}}@layer components;@layer utilities{.\!absolute{position:absolute!important}.static{position:static}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-5{margin-block:calc(var(--spacing) * 5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.flex{display:flex}.grid{display:grid}.inline{display:inline}.h-full{height:100%}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[16rem\]{min-height:16rem}.\!w-full{width:100%!important}.w-full{width:100%}.\!max-w-full{max-width:100%!important}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-max{min-width:max-content}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.grid-cols-\[minmax\(18rem\,22rem\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(18rem,22rem) minmax(0,1fr)}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}: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)))}.self-end{align-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded-lg{border-radius:var(--radius-lg)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.border,.border-1{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.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-gray-300{border-color:var(--color-gray-300)}.border-primary-400{border-color:var(--p-primary-400)}@supports (color:color-mix(in lab, red, red)){.border-primary-400{border-color:color-mix(in srgb, var(--p-primary-400) calc(100% * 1), transparent)}}.border-surface{border-color:var(--p-content-border-color)}.bg-primary-50{background-color:var(--p-primary-50)}@supports (color:color-mix(in lab, red, red)){.bg-primary-50{background-color:color-mix(in srgb, var(--p-primary-50) calc(100% * 1), transparent)}}.bg-surface-50{background-color:var(--p-surface-50)}@supports (color:color-mix(in lab, red, red)){.bg-surface-50{background-color:color-mix(in srgb, var(--p-surface-50) calc(100% * 1), transparent)}}.p-1{padding:calc(var(--spacing) * 1)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-4{padding-inline:calc(var(--spacing) * 4)}.pb-0{padding-bottom:calc(var(--spacing) * 0)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-words{overflow-wrap:break-word}.text-muted-color{color:var(--p-text-muted-color)}.\!shadow-none{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.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))}@media (hover:hover){.hover\:bg-surface-100:hover{background-color:var(--p-surface-100)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-surface-100:hover{background-color:color-mix(in srgb, var(--p-surface-100) calc(100% * 1), transparent)}}}@media not all and (min-width:1025px){.max-\[1025px\]\:h-auto{height:auto}.max-\[1025px\]\:max-h-\[42vh\]{max-height:42vh}.max-\[1025px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-\[1025px\]\:gap-3{gap:calc(var(--spacing) * 3)}}@media (min-width:40rem){.sm\:\!w-\[30rem\]{width:30rem!important}.sm\:w-auto{width:auto}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:self-auto{align-self:auto}.sm\:self-center{align-self:center}}@media (min-width:80rem){.xl\:\!w-\[24\%\]{width:24%!important}}}@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0), var(--p-enter-translate-y,0), 0) scale3d(var(--p-enter-scale,1), var(--p-enter-scale,1), var(--p-enter-scale,1)) rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0), var(--p-leave-translate-y,0), 0) scale3d(var(--p-leave-scale,1), var(--p-leave-scale,1), var(--p-leave-scale,1)) rotate(var(--p-leave-rotate,0))}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{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}
@@ -36,6 +36,7 @@ var PermissionsActionKey;
36
36
  })(PermissionsActionKey || (PermissionsActionKey = {}));
37
37
  var ModuleType;
38
38
  (function (ModuleType) {
39
+ ModuleType["MODULE"] = "module";
39
40
  ModuleType["LEVEL"] = "level";
40
41
  ModuleType["LOG"] = "log";
41
42
  ModuleType["LEVELLOG"] = "levelLog";
@@ -185,9 +186,8 @@ let PermissionsState = class PermissionsState extends CrudStateBase {
185
186
  return state.moduleId;
186
187
  }
187
188
  static getLevelId(state) {
188
- return state.moduleType === 'module'
189
- ? state.parentModuleId.toString()
190
- : state.moduleId.toString();
189
+ const scopeId = resolveActiveScopeId(state);
190
+ return scopeId != null ? scopeId.toString() : '';
191
191
  }
192
192
  // ============================================================================
193
193
  // Loading/Error Slice Selectors - REQUIRED for optimal performance
@@ -216,7 +216,7 @@ let PermissionsState = class PermissionsState extends CrudStateBase {
216
216
  request$: req$,
217
217
  onSuccess: (roles) => ({
218
218
  roles: state.moduleType === 'module' ? [{ roles: roles }] : roles,
219
- currentLevelId: moduleId.toString() || '',
219
+ currentLevelId: resolveActiveScopeId(state)?.toString() ?? null,
220
220
  }),
221
221
  });
222
222
  }
@@ -239,10 +239,9 @@ let PermissionsState = class PermissionsState extends CrudStateBase {
239
239
  }
240
240
  loadPermissions(ctx, action) {
241
241
  const state = ctx.getState();
242
- const modulePath = state.moduleType === 'module' ? `module/${state.moduleId}/` : '';
243
- const levelId = state.moduleType === 'module' ? state.parentModuleId : state.moduleId;
242
+ const scopePath = resolvePermissionScopePath(state);
244
243
  const req$ = this.http
245
- .get(`identity/roles/level/${levelId}/${modulePath}${action.roleValue}/permissions`)
244
+ .get(`identity/roles/${scopePath}/${action.roleValue}/permissions`)
246
245
  .pipe(map((response) => response.data.modules));
247
246
  return handleApiRequest({
248
247
  ctx,
@@ -255,10 +254,9 @@ let PermissionsState = class PermissionsState extends CrudStateBase {
255
254
  }
256
255
  loadGroupPermissions(ctx, action) {
257
256
  const state = ctx.getState();
258
- const modulePath = state.moduleType === 'module' ? `module/${state.moduleId}/` : '';
259
- const levelId = state.moduleType === 'module' ? state.parentModuleId : state.moduleId;
257
+ const scopePath = resolvePermissionScopePath(state);
260
258
  const req$ = this.http
261
- .get(`identity/groups/level/${levelId}/${modulePath}${action.groupId}/permissions`)
259
+ .get(`identity/groups/${scopePath}/${action.groupId}/permissions`)
262
260
  .pipe(map((response) => response.data.modules));
263
261
  return handleApiRequest({
264
262
  ctx,
@@ -290,11 +288,11 @@ let PermissionsState = class PermissionsState extends CrudStateBase {
290
288
  updatedPermissions.push({ id: a?.id, isSelected: a?.isSelected });
291
289
  });
292
290
  });
293
- const scopeId = state.moduleType === 'module' ? state.parentModuleId : state.moduleId;
291
+ const { scopeId, scopeType } = resolvePermissionMutationScope(state);
294
292
  const req$ = this.http.put(`identity/roles/${action.roleValue}/setAllPermissions`, { permissions: updatedPermissions }, {
295
293
  params: {
296
294
  scopeId,
297
- scopeType: ModuleType.LEVEL,
295
+ scopeType,
298
296
  },
299
297
  });
300
298
  return handleApiRequest({
@@ -338,11 +336,11 @@ let PermissionsState = class PermissionsState extends CrudStateBase {
338
336
  updatedPermissions.push({ id: a?.id, isSelected: action.enabled });
339
337
  });
340
338
  });
341
- const scopeId = state.moduleType === 'module' ? state.parentModuleId : state.moduleId;
339
+ const { scopeId, scopeType } = resolvePermissionMutationScope(state);
342
340
  const req$ = this.http.put(`identity/roles/${action.roleValue}/setAllPermissions`, { permissions: updatedPermissions }, {
343
341
  params: {
344
342
  scopeId,
345
- scopeType: ModuleType.LEVEL,
343
+ scopeType,
346
344
  },
347
345
  });
348
346
  return handleApiRequest({
@@ -370,10 +368,16 @@ let PermissionsState = class PermissionsState extends CrudStateBase {
370
368
  key: PermissionsActionKey.ToggleAllGroupPermissions,
371
369
  request$: req$,
372
370
  onSuccess: () => ({
373
- groupPermissions: updatedPermissions,
371
+ permissions: state.permissions.map((permissionGroup) => ({
372
+ ...permissionGroup,
373
+ actions: permissionGroup.actions.map((permission) => ({
374
+ ...permission,
375
+ isSelected: action.enabled,
376
+ })),
377
+ })),
374
378
  }),
375
379
  onError: () => ({
376
- groupPermissions: state.groupPermissions,
380
+ permissions: state.permissions,
377
381
  }),
378
382
  errorMessage: 'Failed to toggle all permissions',
379
383
  });
@@ -500,6 +504,34 @@ PermissionsState = __decorate([
500
504
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsState, decorators: [{
501
505
  type: Injectable
502
506
  }], propDecorators: { loadRoles: [], selectRole: [], selectGroup: [], loadPermissions: [], loadGroupPermissions: [], updatePermissionLocally: [], updatePermission: [], updateGroupPermission: [], toggleAllLevelPermissions: [], toggleAllGroupPermissions: [], setModuleInfo: [], reset: [] } });
507
+ function hasParentScope(state) {
508
+ return (state.parentModuleId !== null &&
509
+ state.parentModuleId !== undefined &&
510
+ state.parentModuleId !== '');
511
+ }
512
+ function resolveActiveScopeId(state) {
513
+ if (state.moduleType === 'module') {
514
+ return hasParentScope(state) ? state.parentModuleId : state.moduleId;
515
+ }
516
+ return state.moduleId;
517
+ }
518
+ function resolvePermissionMutationScope(state) {
519
+ if (state.moduleType === 'module' && !hasParentScope(state)) {
520
+ return {
521
+ scopeId: state.moduleId,
522
+ scopeType: ModuleType.MODULE,
523
+ };
524
+ }
525
+ return {
526
+ scopeId: resolveActiveScopeId(state) ?? '',
527
+ scopeType: ModuleType.LEVEL,
528
+ };
529
+ }
530
+ function resolvePermissionScopePath(state) {
531
+ return `${state.parentPath ?? ''}/${state.moduleType}/${state.moduleId}`
532
+ .replace(/\/+/g, '/')
533
+ .replace(/^\//, '');
534
+ }
503
535
 
504
536
  class PermissionsFacade {
505
537
  store = inject(Store);
@@ -544,10 +576,7 @@ class PermissionsFacade {
544
576
  return this.store.dispatch(new LoadRoles());
545
577
  }
546
578
  selectRole(roleValue) {
547
- if (roleValue) {
548
- return this.store.dispatch(new SelectRole(roleValue));
549
- }
550
- return;
579
+ return this.store.dispatch(new SelectRole(roleValue));
551
580
  }
552
581
  selectGroup(groupId) {
553
582
  if (groupId) {
@@ -592,10 +621,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
592
621
 
593
622
  class PermissionsEditDialog {
594
623
  permissionsFacade = inject(PermissionsFacade);
595
- modal = inject(ModalService);
596
- ref = inject(ModalRef);
597
- // permissionGroup = input.required<PermissionLog | null>();
624
+ modal = inject(ModalService, { optional: true });
625
+ ref = inject(ModalRef, { optional: true });
598
626
  permissionGroup = input(null, ...(ngDevMode ? [{ debugName: "permissionGroup" }] : []));
627
+ inline = input(false, ...(ngDevMode ? [{ debugName: "inline" }] : []));
599
628
  // Use new facade pattern
600
629
  addPermissionsLoading = this.permissionsFacade.isUpdatingPermission;
601
630
  addPermissionsError = this.permissionsFacade.updatePermissionError;
@@ -605,6 +634,10 @@ class PermissionsEditDialog {
605
634
  closeDialog = output();
606
635
  actionControls = signal(new Map(), ...(ngDevMode ? [{ debugName: "actionControls" }] : []));
607
636
  toggleAll = signal(false, ...(ngDevMode ? [{ debugName: "toggleAll" }] : []));
637
+ contentClass = computed(() => this.inline()
638
+ ? 'flex flex-col gap-3'
639
+ : `flex flex-col gap-3 p-4 ${this.modal?.contentClass ?? ''}`, ...(ngDevMode ? [{ debugName: "contentClass" }] : []));
640
+ footerClass = computed(() => this.inline() ? 'mt-4 flex justify-end' : (this.modal?.footerClass ?? ''), ...(ngDevMode ? [{ debugName: "footerClass" }] : []));
608
641
  constructor() {
609
642
  effect(() => {
610
643
  const group = this.permissionGroup();
@@ -632,8 +665,7 @@ class PermissionsEditDialog {
632
665
  }
633
666
  }
634
667
  onClose() {
635
- // this.closeDialog.emit();
636
- this.ref.close();
668
+ this.ref?.close();
637
669
  }
638
670
  trackByActionId(_index, action) {
639
671
  return action.id;
@@ -655,7 +687,9 @@ class PermissionsEditDialog {
655
687
  }
656
688
  subscription.subscribe({
657
689
  next: () => {
658
- this.onClose();
690
+ if (!this.inline()) {
691
+ this.onClose();
692
+ }
659
693
  },
660
694
  error: (error) => {
661
695
  console.error('Failed to save accessibility permissions:', error);
@@ -672,19 +706,19 @@ class PermissionsEditDialog {
672
706
  }
673
707
  }
674
708
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsEditDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
675
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: PermissionsEditDialog, isStandalone: true, selector: "mt-permissions-edit-dialog", inputs: { permissionGroup: { classPropertyName: "permissionGroup", publicName: "permissionGroup", isSignal: true, isRequired: false, transformFunction: null }, levelId: { classPropertyName: "levelId", publicName: "levelId", isSignal: true, isRequired: true, transformFunction: null }, roleValue: { classPropertyName: "roleValue", publicName: "roleValue", isSignal: true, isRequired: true, transformFunction: null }, isGroup: { classPropertyName: "isGroup", publicName: "isGroup", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { closeDialog: "closeDialog" }, ngImport: i0, template: "<div [class]=\"'flex flex-col gap-3 p-4 ' + modal.contentClass\">\r\n @if (permissionGroup(); as group) {\r\n <div\r\n class=\"flex items-center justify-between border rounded-lg p-3 border-surface mb-4\"\r\n >\r\n <span class=\"text-sm font-medium\">{{\r\n \"permissions.selectAll\" | transloco\r\n }}</span>\r\n <mt-toggle-field\r\n [(ngModel)]=\"toggleAll\"\r\n (onChange)=\"selectAll()\"\r\n ></mt-toggle-field>\r\n </div>\r\n @for (action of group.actions; track trackByActionId($index, action)) {\r\n <div\r\n class=\"flex items-center justify-between border rounded-lg p-3 border-surface\"\r\n >\r\n <span class=\"text-sm font-medium\">{{ action.name?.display }}</span>\r\n <mt-toggle-field\r\n [formControl]=\"getControl(action.id)\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n }\r\n</div>\r\n<div [class]=\"modal.footerClass\">\r\n <mt-button\r\n [label]=\"'save'\"\r\n (click)=\"onSave()\"\r\n [loading]=\"addPermissionsLoading()\"\r\n />\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: i2.TranslocoPipe, name: "transloco" }] });
709
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: PermissionsEditDialog, isStandalone: true, selector: "mt-permissions-edit-dialog", inputs: { permissionGroup: { classPropertyName: "permissionGroup", publicName: "permissionGroup", isSignal: true, isRequired: false, transformFunction: null }, inline: { classPropertyName: "inline", publicName: "inline", isSignal: true, isRequired: false, transformFunction: null }, levelId: { classPropertyName: "levelId", publicName: "levelId", isSignal: true, isRequired: true, transformFunction: null }, roleValue: { classPropertyName: "roleValue", publicName: "roleValue", isSignal: true, isRequired: true, transformFunction: null }, isGroup: { classPropertyName: "isGroup", publicName: "isGroup", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { closeDialog: "closeDialog" }, ngImport: i0, template: "<div [class]=\"contentClass()\">\r\n @if (permissionGroup(); as group) {\r\n <div\r\n class=\"mb-4 flex flex-col gap-3 rounded-lg border border-surface p-3 sm:flex-row sm:items-center sm:justify-between\"\r\n >\r\n <span class=\"text-sm font-medium\">{{\r\n \"permissions.selectAll\" | transloco\r\n }}</span>\r\n <mt-toggle-field\r\n class=\"self-end shrink-0 sm:self-center\"\r\n [(ngModel)]=\"toggleAll\"\r\n (onChange)=\"selectAll()\"\r\n ></mt-toggle-field>\r\n </div>\r\n @for (action of group.actions; track trackByActionId($index, action)) {\r\n <div\r\n class=\"flex flex-col gap-3 rounded-lg border border-surface p-3 sm:flex-row sm:items-center sm:justify-between\"\r\n >\r\n <span class=\"min-w-0 break-words text-sm font-medium\">{{\r\n action.name?.display\r\n }}</span>\r\n <mt-toggle-field\r\n class=\"self-end shrink-0 sm:self-center\"\r\n [formControl]=\"getControl(action.id)\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n }\r\n</div>\r\n<div [class]=\"footerClass()\">\r\n <mt-button\r\n class=\"w-full sm:w-auto\"\r\n [label]=\"'save' | transloco\"\r\n (click)=\"onSave()\"\r\n [loading]=\"addPermissionsLoading()\"\r\n />\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: i2.TranslocoPipe, name: "transloco" }] });
676
710
  }
677
711
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsEditDialog, decorators: [{
678
712
  type: Component,
679
- args: [{ selector: 'mt-permissions-edit-dialog', standalone: true, imports: [
713
+ args: [{ selector: 'mt-permissions-edit-dialog', imports: [
680
714
  CommonModule,
681
715
  ReactiveFormsModule,
682
716
  ToggleField,
683
717
  TranslocoModule,
684
718
  FormsModule,
685
719
  Button,
686
- ], template: "<div [class]=\"'flex flex-col gap-3 p-4 ' + modal.contentClass\">\r\n @if (permissionGroup(); as group) {\r\n <div\r\n class=\"flex items-center justify-between border rounded-lg p-3 border-surface mb-4\"\r\n >\r\n <span class=\"text-sm font-medium\">{{\r\n \"permissions.selectAll\" | transloco\r\n }}</span>\r\n <mt-toggle-field\r\n [(ngModel)]=\"toggleAll\"\r\n (onChange)=\"selectAll()\"\r\n ></mt-toggle-field>\r\n </div>\r\n @for (action of group.actions; track trackByActionId($index, action)) {\r\n <div\r\n class=\"flex items-center justify-between border rounded-lg p-3 border-surface\"\r\n >\r\n <span class=\"text-sm font-medium\">{{ action.name?.display }}</span>\r\n <mt-toggle-field\r\n [formControl]=\"getControl(action.id)\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n }\r\n</div>\r\n<div [class]=\"modal.footerClass\">\r\n <mt-button\r\n [label]=\"'save'\"\r\n (click)=\"onSave()\"\r\n [loading]=\"addPermissionsLoading()\"\r\n />\r\n</div>\r\n" }]
687
- }], ctorParameters: () => [], propDecorators: { permissionGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "permissionGroup", required: false }] }], levelId: [{ type: i0.Input, args: [{ isSignal: true, alias: "levelId", required: true }] }], roleValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "roleValue", required: true }] }], isGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "isGroup", required: true }] }], closeDialog: [{ type: i0.Output, args: ["closeDialog"] }] } });
720
+ ], template: "<div [class]=\"contentClass()\">\r\n @if (permissionGroup(); as group) {\r\n <div\r\n class=\"mb-4 flex flex-col gap-3 rounded-lg border border-surface p-3 sm:flex-row sm:items-center sm:justify-between\"\r\n >\r\n <span class=\"text-sm font-medium\">{{\r\n \"permissions.selectAll\" | transloco\r\n }}</span>\r\n <mt-toggle-field\r\n class=\"self-end shrink-0 sm:self-center\"\r\n [(ngModel)]=\"toggleAll\"\r\n (onChange)=\"selectAll()\"\r\n ></mt-toggle-field>\r\n </div>\r\n @for (action of group.actions; track trackByActionId($index, action)) {\r\n <div\r\n class=\"flex flex-col gap-3 rounded-lg border border-surface p-3 sm:flex-row sm:items-center sm:justify-between\"\r\n >\r\n <span class=\"min-w-0 break-words text-sm font-medium\">{{\r\n action.name?.display\r\n }}</span>\r\n <mt-toggle-field\r\n class=\"self-end shrink-0 sm:self-center\"\r\n [formControl]=\"getControl(action.id)\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n }\r\n</div>\r\n<div [class]=\"footerClass()\">\r\n <mt-button\r\n class=\"w-full sm:w-auto\"\r\n [label]=\"'save' | transloco\"\r\n (click)=\"onSave()\"\r\n [loading]=\"addPermissionsLoading()\"\r\n />\r\n</div>\r\n" }]
721
+ }], ctorParameters: () => [], propDecorators: { permissionGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "permissionGroup", required: false }] }], inline: [{ type: i0.Input, args: [{ isSignal: true, alias: "inline", required: false }] }], levelId: [{ type: i0.Input, args: [{ isSignal: true, alias: "levelId", required: true }] }], roleValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "roleValue", required: true }] }], isGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "isGroup", required: true }] }], closeDialog: [{ type: i0.Output, args: ["closeDialog"] }] } });
688
722
 
689
723
  class PermissionsPage {
690
724
  permissionsFacade = inject(PermissionsFacade);
@@ -698,9 +732,9 @@ class PermissionsPage {
698
732
  // Use new facade pattern
699
733
  levelRoles = this.permissionsFacade.roles;
700
734
  selectedRoleValue = this.permissionsFacade.selectedRoleValue;
701
- selectedRole = linkedSignal(this.selectedRoleValue, ...(ngDevMode ? [{ debugName: "selectedRole" }] : []));
735
+ selectedRole = computed(() => this.selectedRoleValue() ?? '', ...(ngDevMode ? [{ debugName: "selectedRole" }] : []));
702
736
  selectedGroupValue = this.permissionsFacade.selectedGroupValue;
703
- selectedGroup = linkedSignal(this.selectedGroupValue, ...(ngDevMode ? [{ debugName: "selectedGroup" }] : []));
737
+ selectedGroup = computed(() => this.selectedGroupValue(), ...(ngDevMode ? [{ debugName: "selectedGroup" }] : []));
704
738
  permissions = this.permissionsFacade.permissions;
705
739
  loading = this.permissionsFacade.isLoadingRoles;
706
740
  permissionsLoading = this.permissionsFacade.isLoadingPermissions;
@@ -715,6 +749,13 @@ class PermissionsPage {
715
749
  const idParam = this.route.snapshot.firstChild?.data['selectedTab'];
716
750
  return idParam ? idParam : 'roles';
717
751
  }, ...(ngDevMode ? [{ debugName: "selectedTabFromParams" }] : []));
752
+ permissionTargetValue = computed(() => this.selectedTab() === 'roles'
753
+ ? (this.selectedRoleValue() ?? '')
754
+ : (this.selectedGroup()?.toString() ?? ''), ...(ngDevMode ? [{ debugName: "permissionTargetValue" }] : []));
755
+ singlePermissionGroup = computed(() => {
756
+ const permissionGroups = this.permissions();
757
+ return permissionGroups.length === 1 ? permissionGroups[0] : null;
758
+ }, ...(ngDevMode ? [{ debugName: "singlePermissionGroup" }] : []));
718
759
  selectedTab = linkedSignal(this.selectedTabFromParams, ...(ngDevMode ? [{ debugName: "selectedTab" }] : []));
719
760
  tabsList = signal([
720
761
  {
@@ -758,7 +799,6 @@ class PermissionsPage {
758
799
  : null;
759
800
  if (routeRole) {
760
801
  if (selectedRoleValue !== routeRole.value) {
761
- this.selectedRole.set(routeRole.value);
762
802
  this.permissionsFacade.selectRole(routeRole.value);
763
803
  }
764
804
  return;
@@ -772,16 +812,6 @@ class PermissionsPage {
772
812
  }
773
813
  ngOnInit() {
774
814
  this.permissionsFacade.selectRole('');
775
- this.route.parent?.paramMap
776
- .pipe(takeUntilDestroyed(this.destroyRef))
777
- .subscribe((params) => {
778
- const levelIdFromRoute = params.get('levelId');
779
- if (levelIdFromRoute) {
780
- this.permissionsFacade.reset();
781
- this.permissionsFacade.setModuleInfo('level', levelIdFromRoute);
782
- this.permissionsFacade.loadRoles();
783
- }
784
- });
785
815
  this.permissionsFacade.loadRoles();
786
816
  this.accessibilitiesFacade.getGroups();
787
817
  this.allPermissionsToggle.valueChanges
@@ -806,7 +836,6 @@ class PermissionsPage {
806
836
  if (!firstRoleValue) {
807
837
  return;
808
838
  }
809
- this.selectedRole.set(firstRoleValue);
810
839
  this.router.navigate(['roles', firstRoleValue], {
811
840
  relativeTo: this.route,
812
841
  replaceUrl,
@@ -822,7 +851,7 @@ class PermissionsPage {
822
851
  this.modal.openModal(PermissionsEditDialog, 'drawer', {
823
852
  header: this.translocoService.translate('permissions.setPermissions'),
824
853
  position: 'end',
825
- styleClass: '!w-[24%] !absolute !shadow-none',
854
+ styleClass: '!absolute !shadow-none !w-full !max-w-full sm:!w-[30rem] xl:!w-[24%]',
826
855
  appendTo: 'page-content',
827
856
  inputValues: {
828
857
  permissionGroup: group,
@@ -886,7 +915,7 @@ class PermissionsPage {
886
915
  this.permissionsFacade.reset();
887
916
  }
888
917
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
889
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: PermissionsPage, isStandalone: true, selector: "mt-permissions-page", ngImport: i0, template: "<div id=\"permissions-page-card\" class=\"flex gap-4 p-1\">\r\n <div class=\"w-1/5 flex-shrink-0\">\r\n <mt-card class=\"h-full flex flex-col\">\r\n <ng-template #headless>\r\n <div class=\"flex flex-col h-full\">\r\n <div\r\n class=\"p-4 pb-0 bg-surface-50 rounded-t-2xl border-b border-surface\"\r\n >\r\n <h2 class=\"text-lg font-semibold mb-3\">\r\n {{ \"permissions.rolesAndGroups\" | transloco }}\r\n </h2>\r\n\r\n <mt-tabs\r\n [(active)]=\"selectedTab\"\r\n [options]=\"tabsList()\"\r\n size=\"large\"\r\n (onChange)=\"onTabChange($event)\"\r\n />\r\n </div>\r\n\r\n <div class=\"flex-1 overflow-y-auto p-4\">\r\n @if (loading()) {\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n } @else {\r\n @if (selectedTab() === \"roles\") {\r\n @for (level of levelRoles(); track level) {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n <h2 class=\"font-semibold\">{{ level?.level?.display }}</h2>\r\n @for (role of level.roles; track role.value) {\r\n <div\r\n class=\"p-3 border-2 border-dashed border-gray-300 rounded-lg cursor-pointer transition-colors flex items-center gap-3\"\r\n [class.bg-primary-50]=\"selectedRole() === role.value\"\r\n [class.hover:bg-surface]=\"selectedRole() !== role.value\"\r\n [class.border-primary-400]=\"\r\n selectedRole() === role.value\r\n \"\r\n [style.--p-avatar-background]=\"\r\n selectedRole() === role.value\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedRole() === role.value ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectRole(role.value)\"\r\n >\r\n <mt-avatar [icon]=\"'user.user-check-01'\" shape=\"square\">\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ role.name?.display }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noRolesFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noLevelRolesFound\" | transloco }}\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n @for (group of groups(); track group.name) {\r\n <div\r\n class=\"p-3 border-2 border-dashed border-gray-300 rounded-lg cursor-pointer transition-colors flex items-center gap-3\"\r\n [class.bg-primary-50]=\"selectedGroup() === group.id\"\r\n [class.hover:bg-surface]=\"selectedGroup() !== group.id\"\r\n [class.border-primary-400]=\"selectedGroup() === group.id\"\r\n [style.--p-avatar-background]=\"\r\n selectedGroup() === group.id\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedGroup() === group.id ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectGroup(group.id)\"\r\n >\r\n <mt-avatar [icon]=\"'user.users-check'\" shape=\"square\">\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ group.name?.display }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noGroupsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n\r\n <div class=\"min-w-0 w-1/2\">\r\n @if (!selectedRole() && !selectedGroup()) {\r\n <mt-card class=\"h-full\">\r\n <ng-template #headless>\r\n <div class=\"flex items-center justify-center h-full text-muted-color\">\r\n {{ \"permissions.selectRoleOrGroupToViewPermissions\" | transloco }}\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n } @else {\r\n <mt-card class=\"h-full\">\r\n <div class=\"flex flex-col h-full\">\r\n <ng-template #headless>\r\n <div class=\"p-4 pb-2 mb-5 border-b border-surface\">\r\n <h2 class=\"text-lg font-semibold mb-3\">\r\n {{ \"permissions.permissions\" | transloco }}\r\n </h2>\r\n </div>\r\n @if (permissionsLoading()) {\r\n <div class=\"mx-4\">\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"mb-5 p-3 mx-4 rounded-lg border-1 border-surface flex items-center justify-between\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n [icon]=\"'security.lock-unlocked-01'\"\r\n shape=\"square\"\r\n size=\"large\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"'var(--p-' + 'primary' + '-600)'\"\r\n >\r\n </mt-avatar>\r\n <div>\r\n <div class=\"text-sm font-semibold\">\r\n {{ \"permissions.setAllPermissions\" | transloco }}\r\n </div>\r\n <div class=\"text-xs text-muted-color\">\r\n {{ \"permissions.recommendedForSimpleForms\" | transloco }}\r\n </div>\r\n </div>\r\n </div>\r\n <mt-toggle-field\r\n [formControl]=\"allPermissionsToggle\"\r\n ></mt-toggle-field>\r\n </div>\r\n\r\n <div class=\"flex-1 px-4 overflow-y-auto border-t border-surface\">\r\n <div class=\"space-y-3 my-5\">\r\n @for (group of permissions(); track group.name) {\r\n <div\r\n class=\"p-2 border-1 border-surface rounded-lg flex items-center justify-between hover:bg-surface-100 transition-colors\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n [icon]=\"'editor.dotpoints-02'\"\r\n shape=\"square\"\r\n size=\"normal\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n 'var(--p-' + 'primary' + '-600)'\r\n \"\r\n >\r\n </mt-avatar>\r\n <span class=\"text-sm\">{{ group.name?.display }}</span>\r\n </div>\r\n <mt-button\r\n [text]=\"true\"\r\n icon=\"custom.pencil\"\r\n severity=\"primary\"\r\n (click)=\"openPermissionDialog(group)\"\r\n >\r\n </mt-button>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noPermissionsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i2$1.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "pipe", type: i2.TranslocoPipe, name: "transloco" }] });
918
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: PermissionsPage, isStandalone: true, selector: "mt-permissions-page", ngImport: i0, template: "<div\r\n id=\"permissions-page-card\"\r\n class=\"grid h-full min-h-0 w-full grid-cols-[minmax(18rem,22rem)_minmax(0,1fr)] gap-4 p-1 max-[1025px]:h-auto max-[1025px]:grid-cols-1 max-[1025px]:gap-3\"\r\n>\r\n <div class=\"min-h-0 min-w-0\">\r\n <mt-card class=\"h-full max-[1025px]:h-auto\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full min-h-0 flex-col\">\r\n <div\r\n class=\"p-4 pb-0 bg-surface-50 rounded-t-2xl border-b border-surface\"\r\n >\r\n <h2 class=\"text-lg font-semibold mb-3\">\r\n {{ \"permissions.rolesAndGroups\" | transloco }}\r\n </h2>\r\n\r\n <div class=\"overflow-x-auto pb-4\">\r\n <mt-tabs\r\n class=\"min-w-max\"\r\n [(active)]=\"selectedTab\"\r\n [options]=\"tabsList()\"\r\n size=\"large\"\r\n (onChange)=\"onTabChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-1 overflow-y-auto p-4 max-[1025px]:max-h-[42vh]\">\r\n @if (loading()) {\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n } @else {\r\n @if (selectedTab() === \"roles\") {\r\n @for (level of levelRoles(); track level) {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n <h2 class=\"font-semibold\">{{ level?.level?.display }}</h2>\r\n @for (role of level.roles; track role.value) {\r\n <div\r\n class=\"flex items-start gap-3 rounded-lg border-2 border-dashed border-gray-300 p-3 transition-colors cursor-pointer\"\r\n [class.bg-primary-50]=\"selectedRole() === role.value\"\r\n [class.hover:bg-surface]=\"selectedRole() !== role.value\"\r\n [class.border-primary-400]=\"\r\n selectedRole() === role.value\r\n \"\r\n [style.--p-avatar-background]=\"\r\n selectedRole() === role.value\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedRole() === role.value ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectRole(role.value)\"\r\n >\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'user.user-check-01'\"\r\n shape=\"square\"\r\n >\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ role.name?.display }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noRolesFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noLevelRolesFound\" | transloco }}\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n @for (group of groups(); track group.name) {\r\n <div\r\n class=\"flex items-start gap-3 rounded-lg border-2 border-dashed border-gray-300 p-3 transition-colors cursor-pointer\"\r\n [class.bg-primary-50]=\"selectedGroup() === group.id\"\r\n [class.hover:bg-surface]=\"selectedGroup() !== group.id\"\r\n [class.border-primary-400]=\"selectedGroup() === group.id\"\r\n [style.--p-avatar-background]=\"\r\n selectedGroup() === group.id\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedGroup() === group.id ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectGroup(group.id)\"\r\n >\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'user.users-check'\"\r\n shape=\"square\"\r\n >\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ group.name?.display }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noGroupsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n\r\n <div class=\"min-h-0 min-w-0\">\r\n @if (!selectedRole() && !selectedGroup()) {\r\n <mt-card class=\"h-full max-[1025px]:h-auto\">\r\n <ng-template #headless>\r\n <div\r\n class=\"flex h-full min-h-[16rem] items-center justify-center p-6 text-center text-muted-color\"\r\n >\r\n {{ \"permissions.selectRoleOrGroupToViewPermissions\" | transloco }}\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n } @else {\r\n <mt-card class=\"h-full max-[1025px]:h-auto\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full min-h-0 flex-col\">\r\n <div class=\"mb-5 border-b border-surface p-4 pb-2\">\r\n <h2 class=\"mb-3 text-lg font-semibold\">\r\n {{ \"permissions.permissions\" | transloco }}\r\n </h2>\r\n </div>\r\n @if (permissionsLoading()) {\r\n <div class=\"mx-4\">\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"mx-4 mb-5 flex flex-col gap-3 rounded-lg border-1 border-surface p-3 sm:flex-row sm:items-center sm:justify-between\"\r\n >\r\n <div class=\"flex min-w-0 items-start gap-3\">\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'security.lock-unlocked-01'\"\r\n shape=\"square\"\r\n size=\"large\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"'var(--p-' + 'primary' + '-600)'\"\r\n >\r\n </mt-avatar>\r\n <div class=\"min-w-0\">\r\n <div class=\"text-sm font-semibold\">\r\n {{ \"permissions.setAllPermissions\" | transloco }}\r\n </div>\r\n <div class=\"text-xs text-muted-color break-words\">\r\n {{ \"permissions.recommendedForSimpleForms\" | transloco }}\r\n </div>\r\n </div>\r\n </div>\r\n <mt-toggle-field\r\n class=\"self-end shrink-0 sm:self-center\"\r\n [formControl]=\"allPermissionsToggle\"\r\n ></mt-toggle-field>\r\n </div>\r\n\r\n <div\r\n class=\"min-h-0 flex-1 overflow-y-auto border-t border-surface px-4\"\r\n >\r\n @if (singlePermissionGroup(); as group) {\r\n <div\r\n class=\"my-5 rounded-lg border border-surface bg-surface-50 p-4\"\r\n >\r\n <div class=\"mb-4 flex items-start gap-3\">\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'editor.dotpoints-02'\"\r\n shape=\"square\"\r\n size=\"normal\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n 'var(--p-' + 'primary' + '-600)'\r\n \"\r\n >\r\n </mt-avatar>\r\n <span class=\"min-w-0 break-words text-sm font-medium\">\r\n {{ group.name?.display }}\r\n </span>\r\n </div>\r\n\r\n <mt-permissions-edit-dialog\r\n [inline]=\"true\"\r\n [permissionGroup]=\"group\"\r\n [levelId]=\"levelId()\"\r\n [roleValue]=\"permissionTargetValue()\"\r\n [isGroup]=\"selectedTab() !== 'roles'\"\r\n />\r\n </div>\r\n } @else {\r\n <div class=\"space-y-3 my-5\">\r\n @for (group of permissions(); track group.name) {\r\n <div\r\n class=\"flex flex-col gap-3 rounded-lg border-1 border-surface p-3 transition-colors hover:bg-surface-100 sm:flex-row sm:items-center sm:justify-between\"\r\n >\r\n <div class=\"flex min-w-0 items-start gap-3\">\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'editor.dotpoints-02'\"\r\n shape=\"square\"\r\n size=\"normal\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n 'var(--p-' + 'primary' + '-600)'\r\n \"\r\n >\r\n </mt-avatar>\r\n <span class=\"min-w-0 break-words text-sm\">\r\n {{ group.name?.display }}\r\n </span>\r\n </div>\r\n <mt-button\r\n class=\"self-end sm:self-auto\"\r\n [text]=\"true\"\r\n icon=\"custom.pencil\"\r\n severity=\"primary\"\r\n (click)=\"openPermissionDialog(group)\"\r\n >\r\n </mt-button>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noPermissionsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n }\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i2$1.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "component", type: PermissionsEditDialog, selector: "mt-permissions-edit-dialog", inputs: ["permissionGroup", "inline", "levelId", "roleValue", "isGroup"], outputs: ["closeDialog"] }, { kind: "pipe", type: i2.TranslocoPipe, name: "transloco" }] });
890
919
  }
891
920
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: PermissionsPage, decorators: [{
892
921
  type: Component,
@@ -900,7 +929,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
900
929
  Avatar,
901
930
  SkeletonModule,
902
931
  Tabs,
903
- ], template: "<div id=\"permissions-page-card\" class=\"flex gap-4 p-1\">\r\n <div class=\"w-1/5 flex-shrink-0\">\r\n <mt-card class=\"h-full flex flex-col\">\r\n <ng-template #headless>\r\n <div class=\"flex flex-col h-full\">\r\n <div\r\n class=\"p-4 pb-0 bg-surface-50 rounded-t-2xl border-b border-surface\"\r\n >\r\n <h2 class=\"text-lg font-semibold mb-3\">\r\n {{ \"permissions.rolesAndGroups\" | transloco }}\r\n </h2>\r\n\r\n <mt-tabs\r\n [(active)]=\"selectedTab\"\r\n [options]=\"tabsList()\"\r\n size=\"large\"\r\n (onChange)=\"onTabChange($event)\"\r\n />\r\n </div>\r\n\r\n <div class=\"flex-1 overflow-y-auto p-4\">\r\n @if (loading()) {\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n } @else {\r\n @if (selectedTab() === \"roles\") {\r\n @for (level of levelRoles(); track level) {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n <h2 class=\"font-semibold\">{{ level?.level?.display }}</h2>\r\n @for (role of level.roles; track role.value) {\r\n <div\r\n class=\"p-3 border-2 border-dashed border-gray-300 rounded-lg cursor-pointer transition-colors flex items-center gap-3\"\r\n [class.bg-primary-50]=\"selectedRole() === role.value\"\r\n [class.hover:bg-surface]=\"selectedRole() !== role.value\"\r\n [class.border-primary-400]=\"\r\n selectedRole() === role.value\r\n \"\r\n [style.--p-avatar-background]=\"\r\n selectedRole() === role.value\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedRole() === role.value ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectRole(role.value)\"\r\n >\r\n <mt-avatar [icon]=\"'user.user-check-01'\" shape=\"square\">\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ role.name?.display }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noRolesFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noLevelRolesFound\" | transloco }}\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n @for (group of groups(); track group.name) {\r\n <div\r\n class=\"p-3 border-2 border-dashed border-gray-300 rounded-lg cursor-pointer transition-colors flex items-center gap-3\"\r\n [class.bg-primary-50]=\"selectedGroup() === group.id\"\r\n [class.hover:bg-surface]=\"selectedGroup() !== group.id\"\r\n [class.border-primary-400]=\"selectedGroup() === group.id\"\r\n [style.--p-avatar-background]=\"\r\n selectedGroup() === group.id\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedGroup() === group.id ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectGroup(group.id)\"\r\n >\r\n <mt-avatar [icon]=\"'user.users-check'\" shape=\"square\">\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ group.name?.display }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noGroupsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n\r\n <div class=\"min-w-0 w-1/2\">\r\n @if (!selectedRole() && !selectedGroup()) {\r\n <mt-card class=\"h-full\">\r\n <ng-template #headless>\r\n <div class=\"flex items-center justify-center h-full text-muted-color\">\r\n {{ \"permissions.selectRoleOrGroupToViewPermissions\" | transloco }}\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n } @else {\r\n <mt-card class=\"h-full\">\r\n <div class=\"flex flex-col h-full\">\r\n <ng-template #headless>\r\n <div class=\"p-4 pb-2 mb-5 border-b border-surface\">\r\n <h2 class=\"text-lg font-semibold mb-3\">\r\n {{ \"permissions.permissions\" | transloco }}\r\n </h2>\r\n </div>\r\n @if (permissionsLoading()) {\r\n <div class=\"mx-4\">\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"mb-5 p-3 mx-4 rounded-lg border-1 border-surface flex items-center justify-between\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n [icon]=\"'security.lock-unlocked-01'\"\r\n shape=\"square\"\r\n size=\"large\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"'var(--p-' + 'primary' + '-600)'\"\r\n >\r\n </mt-avatar>\r\n <div>\r\n <div class=\"text-sm font-semibold\">\r\n {{ \"permissions.setAllPermissions\" | transloco }}\r\n </div>\r\n <div class=\"text-xs text-muted-color\">\r\n {{ \"permissions.recommendedForSimpleForms\" | transloco }}\r\n </div>\r\n </div>\r\n </div>\r\n <mt-toggle-field\r\n [formControl]=\"allPermissionsToggle\"\r\n ></mt-toggle-field>\r\n </div>\r\n\r\n <div class=\"flex-1 px-4 overflow-y-auto border-t border-surface\">\r\n <div class=\"space-y-3 my-5\">\r\n @for (group of permissions(); track group.name) {\r\n <div\r\n class=\"p-2 border-1 border-surface rounded-lg flex items-center justify-between hover:bg-surface-100 transition-colors\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n [icon]=\"'editor.dotpoints-02'\"\r\n shape=\"square\"\r\n size=\"normal\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n 'var(--p-' + 'primary' + '-600)'\r\n \"\r\n >\r\n </mt-avatar>\r\n <span class=\"text-sm\">{{ group.name?.display }}</span>\r\n </div>\r\n <mt-button\r\n [text]=\"true\"\r\n icon=\"custom.pencil\"\r\n severity=\"primary\"\r\n (click)=\"openPermissionDialog(group)\"\r\n >\r\n </mt-button>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noPermissionsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n</div>\r\n" }]
932
+ PermissionsEditDialog,
933
+ ], template: "<div\r\n id=\"permissions-page-card\"\r\n class=\"grid h-full min-h-0 w-full grid-cols-[minmax(18rem,22rem)_minmax(0,1fr)] gap-4 p-1 max-[1025px]:h-auto max-[1025px]:grid-cols-1 max-[1025px]:gap-3\"\r\n>\r\n <div class=\"min-h-0 min-w-0\">\r\n <mt-card class=\"h-full max-[1025px]:h-auto\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full min-h-0 flex-col\">\r\n <div\r\n class=\"p-4 pb-0 bg-surface-50 rounded-t-2xl border-b border-surface\"\r\n >\r\n <h2 class=\"text-lg font-semibold mb-3\">\r\n {{ \"permissions.rolesAndGroups\" | transloco }}\r\n </h2>\r\n\r\n <div class=\"overflow-x-auto pb-4\">\r\n <mt-tabs\r\n class=\"min-w-max\"\r\n [(active)]=\"selectedTab\"\r\n [options]=\"tabsList()\"\r\n size=\"large\"\r\n (onChange)=\"onTabChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-1 overflow-y-auto p-4 max-[1025px]:max-h-[42vh]\">\r\n @if (loading()) {\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n } @else {\r\n @if (selectedTab() === \"roles\") {\r\n @for (level of levelRoles(); track level) {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n <h2 class=\"font-semibold\">{{ level?.level?.display }}</h2>\r\n @for (role of level.roles; track role.value) {\r\n <div\r\n class=\"flex items-start gap-3 rounded-lg border-2 border-dashed border-gray-300 p-3 transition-colors cursor-pointer\"\r\n [class.bg-primary-50]=\"selectedRole() === role.value\"\r\n [class.hover:bg-surface]=\"selectedRole() !== role.value\"\r\n [class.border-primary-400]=\"\r\n selectedRole() === role.value\r\n \"\r\n [style.--p-avatar-background]=\"\r\n selectedRole() === role.value\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedRole() === role.value ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectRole(role.value)\"\r\n >\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'user.user-check-01'\"\r\n shape=\"square\"\r\n >\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ role.name?.display }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noRolesFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noLevelRolesFound\" | transloco }}\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n @for (group of groups(); track group.name) {\r\n <div\r\n class=\"flex items-start gap-3 rounded-lg border-2 border-dashed border-gray-300 p-3 transition-colors cursor-pointer\"\r\n [class.bg-primary-50]=\"selectedGroup() === group.id\"\r\n [class.hover:bg-surface]=\"selectedGroup() !== group.id\"\r\n [class.border-primary-400]=\"selectedGroup() === group.id\"\r\n [style.--p-avatar-background]=\"\r\n selectedGroup() === group.id\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedGroup() === group.id ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectGroup(group.id)\"\r\n >\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'user.users-check'\"\r\n shape=\"square\"\r\n >\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ group.name?.display }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noGroupsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n\r\n <div class=\"min-h-0 min-w-0\">\r\n @if (!selectedRole() && !selectedGroup()) {\r\n <mt-card class=\"h-full max-[1025px]:h-auto\">\r\n <ng-template #headless>\r\n <div\r\n class=\"flex h-full min-h-[16rem] items-center justify-center p-6 text-center text-muted-color\"\r\n >\r\n {{ \"permissions.selectRoleOrGroupToViewPermissions\" | transloco }}\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n } @else {\r\n <mt-card class=\"h-full max-[1025px]:h-auto\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full min-h-0 flex-col\">\r\n <div class=\"mb-5 border-b border-surface p-4 pb-2\">\r\n <h2 class=\"mb-3 text-lg font-semibold\">\r\n {{ \"permissions.permissions\" | transloco }}\r\n </h2>\r\n </div>\r\n @if (permissionsLoading()) {\r\n <div class=\"mx-4\">\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"mx-4 mb-5 flex flex-col gap-3 rounded-lg border-1 border-surface p-3 sm:flex-row sm:items-center sm:justify-between\"\r\n >\r\n <div class=\"flex min-w-0 items-start gap-3\">\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'security.lock-unlocked-01'\"\r\n shape=\"square\"\r\n size=\"large\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"'var(--p-' + 'primary' + '-600)'\"\r\n >\r\n </mt-avatar>\r\n <div class=\"min-w-0\">\r\n <div class=\"text-sm font-semibold\">\r\n {{ \"permissions.setAllPermissions\" | transloco }}\r\n </div>\r\n <div class=\"text-xs text-muted-color break-words\">\r\n {{ \"permissions.recommendedForSimpleForms\" | transloco }}\r\n </div>\r\n </div>\r\n </div>\r\n <mt-toggle-field\r\n class=\"self-end shrink-0 sm:self-center\"\r\n [formControl]=\"allPermissionsToggle\"\r\n ></mt-toggle-field>\r\n </div>\r\n\r\n <div\r\n class=\"min-h-0 flex-1 overflow-y-auto border-t border-surface px-4\"\r\n >\r\n @if (singlePermissionGroup(); as group) {\r\n <div\r\n class=\"my-5 rounded-lg border border-surface bg-surface-50 p-4\"\r\n >\r\n <div class=\"mb-4 flex items-start gap-3\">\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'editor.dotpoints-02'\"\r\n shape=\"square\"\r\n size=\"normal\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n 'var(--p-' + 'primary' + '-600)'\r\n \"\r\n >\r\n </mt-avatar>\r\n <span class=\"min-w-0 break-words text-sm font-medium\">\r\n {{ group.name?.display }}\r\n </span>\r\n </div>\r\n\r\n <mt-permissions-edit-dialog\r\n [inline]=\"true\"\r\n [permissionGroup]=\"group\"\r\n [levelId]=\"levelId()\"\r\n [roleValue]=\"permissionTargetValue()\"\r\n [isGroup]=\"selectedTab() !== 'roles'\"\r\n />\r\n </div>\r\n } @else {\r\n <div class=\"space-y-3 my-5\">\r\n @for (group of permissions(); track group.name) {\r\n <div\r\n class=\"flex flex-col gap-3 rounded-lg border-1 border-surface p-3 transition-colors hover:bg-surface-100 sm:flex-row sm:items-center sm:justify-between\"\r\n >\r\n <div class=\"flex min-w-0 items-start gap-3\">\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'editor.dotpoints-02'\"\r\n shape=\"square\"\r\n size=\"normal\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n 'var(--p-' + 'primary' + '-600)'\r\n \"\r\n >\r\n </mt-avatar>\r\n <span class=\"min-w-0 break-words text-sm\">\r\n {{ group.name?.display }}\r\n </span>\r\n </div>\r\n <mt-button\r\n class=\"self-end sm:self-auto\"\r\n [text]=\"true\"\r\n icon=\"custom.pencil\"\r\n severity=\"primary\"\r\n (click)=\"openPermissionDialog(group)\"\r\n >\r\n </mt-button>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noPermissionsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n }\r\n </div>\r\n</div>\r\n" }]
904
934
  }], ctorParameters: () => [] });
905
935
 
906
936
  // store/index.ts
@@ -1 +1 @@
1
- {"version":3,"file":"masterteam-permissions.mjs","sources":["../../../../packages/masterteam/permissions/src/store/permissions/permissions.model.ts","../../../../packages/masterteam/permissions/src/store/permissions/permissions.actions.ts","../../../../packages/masterteam/permissions/src/store/permissions/permissions.state.ts","../../../../packages/masterteam/permissions/src/store/permissions/permissions.facade.ts","../../../../packages/masterteam/permissions/src/lib/permissions-page/permissions-edit-dialog/permissions-edit-dialog.ts","../../../../packages/masterteam/permissions/src/lib/permissions-page/permissions-edit-dialog/permissions-edit-dialog.html","../../../../packages/masterteam/permissions/src/lib/permissions-page/permissions-page.ts","../../../../packages/masterteam/permissions/src/lib/permissions-page/permissions-page.html","../../../../packages/masterteam/permissions/src/store/index.ts","../../../../packages/masterteam/permissions/src/masterteam-permissions.ts"],"sourcesContent":["import { LoadingStateShape } from '../utils/state-helpers';\r\n\r\nexport interface Role {\r\n name: string;\r\n value: string;\r\n}\r\nexport interface LevelRoles {\r\n level?: string;\r\n levelKey?: string;\r\n scopeType?: string;\r\n scopeId?: string;\r\n roles?: Role[];\r\n}\r\n\r\nexport interface PermissionAction {\r\n id: number;\r\n name: string;\r\n isSelected: boolean;\r\n}\r\n\r\nexport interface PermissionLog {\r\n name: string;\r\n actions: PermissionAction[];\r\n}\r\n\r\nexport interface LevelPermission {\r\n levelName: string;\r\n modules: PermissionLog[];\r\n}\r\n\r\nexport interface RolesResponse {\r\n endpoint: string;\r\n status: number;\r\n code: number;\r\n locale: string;\r\n message: string;\r\n errors: null | string[];\r\n data: LevelRoles[];\r\n cacheSession: string;\r\n}\r\n\r\nexport interface PermissionsResponseData {\r\n modules: PermissionLog[];\r\n}\r\n\r\nexport interface PermissionsResponse {\r\n endpoint: string;\r\n status: number;\r\n code: number;\r\n locale: string;\r\n message: string;\r\n errors: null | string[];\r\n data: PermissionsResponseData;\r\n cacheSession: string;\r\n}\r\n\r\nexport interface GroupPermissionsResponse {\r\n endpoint: string;\r\n status: number;\r\n code: number;\r\n locale: string;\r\n message: string;\r\n errors: null | string[];\r\n data: LevelPermission[];\r\n cacheSession: string;\r\n}\r\n\r\nexport interface UpdatePermissionPayload {\r\n roleValue: string;\r\n levelId: string;\r\n permissions: LevelPermission[];\r\n}\r\n\r\nexport enum PermissionsActionKey {\r\n LoadRoles = 'loadRoles',\r\n SelectRole = 'selectRole',\r\n SelectGroup = 'selectGroup',\r\n LoadPermissions = 'loadPermissions',\r\n LoadGroupPermissions = 'loadGroupPermissions',\r\n UpdatePermission = 'updatePermission',\r\n UpdateGroupPermission = 'updateGroupPermission',\r\n ToggleAllLevelPermissions = 'toggleAllLevelPermissions',\r\n ToggleAllGroupPermissions = 'toggleAllGroupPermissions',\r\n}\r\n\r\nexport interface PermissionsStateModel extends LoadingStateShape<PermissionsActionKey> {\r\n roles: LevelRoles[];\r\n selectedRoleValue: string | null;\r\n selectedGroupValue: string | number | null;\r\n permissions: PermissionLog[];\r\n groupPermissions: LevelPermission[];\r\n currentLevelId: string | null;\r\n moduleType: string;\r\n moduleId: string | number;\r\n parentModuleType?: string | null;\r\n parentModuleId?: string | number | null;\r\n parentPath?: string;\r\n}\r\n\r\nexport enum ModuleType {\r\n LEVEL = 'level',\r\n LOG = 'log',\r\n LEVELLOG = 'levelLog',\r\n}\r\n","export class LoadRoles {\r\n static readonly type = '[Permissions] Load Roles';\r\n constructor() {}\r\n}\r\n\r\nexport class SelectRole {\r\n static readonly type = '[Permissions] Select Role';\r\n constructor(public roleValue: string) {}\r\n}\r\n\r\nexport class SelectGroup {\r\n static readonly type = '[Permissions] Select Group';\r\n constructor(public groupId: number) {}\r\n}\r\n\r\nexport class LoadPermissions {\r\n static readonly type = '[Permissions] Load Permissions';\r\n constructor(\r\n public roleValue: string,\r\n public levelId: string,\r\n ) {}\r\n}\r\n\r\nexport class LoadGroupPermissions {\r\n static readonly type = '[Permissions] Load Group Permissions';\r\n constructor(\r\n public groupId: number,\r\n public levelId: string,\r\n ) {}\r\n}\r\n\r\nexport class UpdatePermissionLocally {\r\n static readonly type = '[Permissions] Update Permission Locally';\r\n constructor(\r\n public roleValue: string,\r\n public levelId: string,\r\n public actionId: number,\r\n public isSelected: boolean,\r\n ) {}\r\n}\r\n\r\nexport class UpdatePermission {\r\n static readonly type = '[Permissions] Update Permission';\r\n constructor(\r\n public roleValue: string,\r\n public levelId: string,\r\n ) {}\r\n}\r\n\r\nexport class UpdateGroupPermission {\r\n static readonly type = '[Permissions] Update Group Permission';\r\n constructor(\r\n public groupId: string,\r\n public levelId: string,\r\n ) {}\r\n}\r\n\r\nexport class ToggleAllLevelPermissions {\r\n static readonly type = '[Permissions] Toggle All Level Permissions';\r\n constructor(\r\n public roleValue: string,\r\n public levelId: string,\r\n public levelName: string,\r\n public enabled: boolean,\r\n ) {}\r\n}\r\n\r\nexport class ToggleAllGroupPermissions {\r\n static readonly type = '[Permissions] Toggle All Group Permissions';\r\n constructor(\r\n public levelId: string,\r\n public groupId: string,\r\n public enabled: boolean,\r\n ) {}\r\n}\r\n\r\nexport class SetModuleInfo {\r\n static readonly type = '[Permissions] Set Module Info';\r\n\r\n constructor(\r\n public readonly moduleType: string,\r\n public readonly moduleId: string | number,\r\n public readonly parentModuleType?: string,\r\n public readonly parentModuleId?: string | number,\r\n public readonly parentPath?: string,\r\n ) {}\r\n}\r\n\r\nexport class Reset {\r\n static readonly type = '[Permissions] Reset Module Info';\r\n\r\n constructor() {}\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport { map } from 'rxjs';\r\nimport { CrudStateBase, handleApiRequest } from '@masterteam/components';\r\nimport {\r\n GroupPermissionsResponse,\r\n LevelPermission,\r\n LevelRoles,\r\n ModuleType,\r\n PermissionLog,\r\n PermissionsResponse,\r\n PermissionsActionKey,\r\n PermissionsStateModel,\r\n RolesResponse,\r\n} from './permissions.model';\r\nimport * as PermissionsActions from './permissions.actions';\r\n\r\n@State<PermissionsStateModel>({\r\n name: 'permissions',\r\n defaults: {\r\n roles: [],\r\n selectedRoleValue: null,\r\n selectedGroupValue: null,\r\n permissions: [],\r\n groupPermissions: [],\r\n currentLevelId: null,\r\n moduleType: '',\r\n moduleId: '',\r\n parentModuleType: null,\r\n parentModuleId: null,\r\n parentPath: '',\r\n loadingActive: [], // Required by LoadingStateShape\r\n errors: {}, // Required by LoadingStateShape\r\n },\r\n})\r\n@Injectable()\r\nexport class PermissionsState extends CrudStateBase<\r\n LevelRoles,\r\n PermissionsStateModel,\r\n PermissionsActionKey\r\n> {\r\n private http = inject(HttpClient);\r\n\r\n // ============================================================================\r\n // Data Selectors - Individual for fine-grained reactivity\r\n // ============================================================================\r\n\r\n @Selector()\r\n static getRoles(state: PermissionsStateModel): LevelRoles[] {\r\n return state.roles;\r\n }\r\n\r\n @Selector()\r\n static getSelectedRoleValue(state: PermissionsStateModel): string | null {\r\n return state.selectedRoleValue;\r\n }\r\n\r\n @Selector()\r\n static getSelectedGroupValue(\r\n state: PermissionsStateModel,\r\n ): string | number | null {\r\n return state.selectedGroupValue;\r\n }\r\n\r\n @Selector()\r\n static getPermissions(state: PermissionsStateModel): PermissionLog[] {\r\n return state.permissions;\r\n }\r\n\r\n @Selector()\r\n static getGroupPermissions(state: PermissionsStateModel): LevelPermission[] {\r\n return state.groupPermissions;\r\n }\r\n\r\n @Selector()\r\n static getModuleType(state: PermissionsStateModel): string {\r\n return state.moduleType;\r\n }\r\n\r\n @Selector()\r\n static getModuleId(state: PermissionsStateModel): string | number {\r\n return state.moduleId;\r\n }\r\n\r\n @Selector()\r\n static getLevelId(state: PermissionsStateModel): string {\r\n return state.moduleType === 'module'\r\n ? state.parentModuleId!.toString()\r\n : state.moduleId.toString();\r\n }\r\n\r\n // ============================================================================\r\n // Loading/Error Slice Selectors - REQUIRED for optimal performance\r\n // ============================================================================\r\n\r\n @Selector()\r\n static getLoadingActive(state: PermissionsStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: PermissionsStateModel,\r\n ): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n // ============================================================================\r\n // CRUD Actions\r\n // ============================================================================\r\n\r\n // ============================================================================\r\n // CRUD Actions\r\n // ============================================================================\r\n\r\n @Action(PermissionsActions.LoadRoles)\r\n loadRoles(ctx: StateContext<PermissionsStateModel>) {\r\n const { moduleType, moduleId, parentPath } = ctx.getState();\r\n const state = ctx.getState();\r\n const req$ = this.http\r\n .get<RolesResponse>(\r\n `identity/roles${parentPath ? '' : '/scopes'}${parentPath}/${moduleType}/${moduleId}${parentPath ? '' : '?inherited=true'}`,\r\n )\r\n .pipe(map((response) => response.data));\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.LoadRoles,\r\n request$: req$,\r\n onSuccess: (roles: any) => ({\r\n roles: state.moduleType === 'module' ? [{ roles: roles }] : roles,\r\n currentLevelId: moduleId.toString() || '',\r\n }),\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Simple State Updates (No HTTP)\r\n // ============================================================================\r\n\r\n @Action(PermissionsActions.SelectRole)\r\n selectRole(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.SelectRole,\r\n ) {\r\n const state = ctx.getState();\r\n ctx.patchState({ selectedRoleValue: action.roleValue });\r\n\r\n if (state.currentLevelId && action.roleValue) {\r\n ctx.dispatch(\r\n new PermissionsActions.LoadPermissions(\r\n action.roleValue,\r\n state.currentLevelId,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n @Action(PermissionsActions.SelectGroup)\r\n selectGroup(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.SelectGroup,\r\n ) {\r\n const state = ctx.getState();\r\n ctx.patchState({ selectedGroupValue: action.groupId });\r\n\r\n if (state.currentLevelId) {\r\n ctx.dispatch(\r\n new PermissionsActions.LoadGroupPermissions(\r\n action.groupId,\r\n state.currentLevelId,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n @Action(PermissionsActions.LoadPermissions)\r\n loadPermissions(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.LoadPermissions,\r\n ) {\r\n const state = ctx.getState();\r\n const modulePath =\r\n state.moduleType === 'module' ? `module/${state.moduleId}/` : '';\r\n const levelId =\r\n state.moduleType === 'module' ? state.parentModuleId! : state.moduleId;\r\n\r\n const req$ = this.http\r\n .get<PermissionsResponse>(\r\n `identity/roles/level/${levelId}/${modulePath}${action.roleValue}/permissions`,\r\n )\r\n .pipe(map((response) => response.data.modules));\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.LoadPermissions,\r\n request$: req$,\r\n onSuccess: (permissions) => ({\r\n permissions,\r\n }),\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.LoadGroupPermissions)\r\n loadGroupPermissions(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.LoadGroupPermissions,\r\n ) {\r\n const state = ctx.getState();\r\n const modulePath =\r\n state.moduleType === 'module' ? `module/${state.moduleId}/` : '';\r\n const levelId =\r\n state.moduleType === 'module' ? state.parentModuleId! : state.moduleId;\r\n\r\n const req$ = this.http\r\n .get<GroupPermissionsResponse>(\r\n `identity/groups/level/${levelId}/${modulePath}${action.groupId}/permissions`,\r\n )\r\n .pipe(map((response: any) => response.data.modules));\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.LoadPermissions,\r\n request$: req$,\r\n onSuccess: (permissions) => ({\r\n permissions,\r\n }),\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.UpdatePermissionLocally)\r\n updatePermissionLocally(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.UpdatePermissionLocally,\r\n ) {\r\n const state = ctx.getState();\r\n\r\n const updatedPermissions = state.permissions.map((log) => ({\r\n ...log,\r\n actions: log.actions.map((act) =>\r\n act.id === action.actionId\r\n ? { ...act, isSelected: action.isSelected }\r\n : act,\r\n ),\r\n }));\r\n\r\n ctx.patchState({ permissions: updatedPermissions });\r\n }\r\n\r\n // ============================================================================\r\n // Complex Operations - use handleApiRequest for transformations\r\n // ============================================================================\r\n\r\n @Action(PermissionsActions.UpdatePermission)\r\n updatePermission(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.UpdatePermission,\r\n ) {\r\n const state = ctx.getState();\r\n const updatedPermissions: any[] = [];\r\n state.permissions?.forEach((p) => {\r\n p?.actions.forEach((a: any) => {\r\n updatedPermissions.push({ id: a?.id, isSelected: a?.isSelected });\r\n });\r\n });\r\n const scopeId =\r\n state.moduleType === 'module' ? state.parentModuleId! : state.moduleId;\r\n\r\n const req$ = this.http.put<PermissionsResponse>(\r\n `identity/roles/${action.roleValue}/setAllPermissions`,\r\n { permissions: updatedPermissions },\r\n {\r\n params: {\r\n scopeId,\r\n scopeType: ModuleType.LEVEL,\r\n },\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.UpdatePermission,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n onError: (error, currentState) => {\r\n // Rollback on error\r\n return { permissions: currentState.permissions };\r\n },\r\n errorMessage: 'Failed to update permission',\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.UpdateGroupPermission)\r\n updateGroupPermission(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.UpdateGroupPermission,\r\n ) {\r\n const state = ctx.getState();\r\n const updatedPermissions: any[] = [];\r\n state.permissions?.forEach((p) => {\r\n p?.actions.forEach((a: any) => {\r\n updatedPermissions.push({ id: a?.id, isSelected: a?.isSelected });\r\n });\r\n });\r\n\r\n const req$ = this.http.put<PermissionsResponse>(\r\n `identity/groups/${action.groupId}/setAllPermissions`,\r\n { permissions: updatedPermissions },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.UpdateGroupPermission,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n onError: (error, currentState) => {\r\n // Rollback on error\r\n return { permissions: currentState.permissions };\r\n },\r\n errorMessage: 'Failed to update permission',\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.ToggleAllLevelPermissions)\r\n toggleAllLevelPermissions(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.ToggleAllLevelPermissions,\r\n ) {\r\n const state = ctx.getState();\r\n\r\n const updatedPermissions: any[] = [];\r\n state.permissions?.forEach((p) => {\r\n p?.actions.forEach((a: any) => {\r\n updatedPermissions.push({ id: a?.id, isSelected: action.enabled });\r\n });\r\n });\r\n\r\n const scopeId =\r\n state.moduleType === 'module' ? state.parentModuleId! : state.moduleId;\r\n\r\n const req$ = this.http.put<PermissionsResponse>(\r\n `identity/roles/${action.roleValue}/setAllPermissions`,\r\n { permissions: updatedPermissions },\r\n {\r\n params: {\r\n scopeId,\r\n scopeType: ModuleType.LEVEL,\r\n },\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.ToggleAllLevelPermissions,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n onError: () => ({\r\n permissions: state.permissions,\r\n }),\r\n errorMessage: 'Failed to toggle all permissions',\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.ToggleAllGroupPermissions)\r\n toggleAllGroupPermissions(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.ToggleAllGroupPermissions,\r\n ) {\r\n const state = ctx.getState();\r\n\r\n const updatedPermissions: any[] = [];\r\n state.permissions?.forEach((p) => {\r\n p?.actions.forEach((a: any) => {\r\n updatedPermissions.push({ id: a?.id, isSelected: action.enabled });\r\n });\r\n });\r\n\r\n const req$ = this.http.put<PermissionsResponse>(\r\n `identity/groups/${action.groupId}/setAllPermissions`,\r\n { permissions: updatedPermissions },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.ToggleAllGroupPermissions,\r\n request$: req$,\r\n onSuccess: () => ({\r\n groupPermissions: updatedPermissions,\r\n }),\r\n onError: () => ({\r\n groupPermissions: state.groupPermissions,\r\n }),\r\n errorMessage: 'Failed to toggle all permissions',\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.SetModuleInfo)\r\n setModuleInfo(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.SetModuleInfo,\r\n ) {\r\n let parentPath = '';\r\n if (action.parentModuleType && action.parentModuleId) {\r\n parentPath = `/${action.parentModuleType}/${action.parentModuleId}`;\r\n } else if (action.parentPath) {\r\n parentPath = action.parentPath;\r\n }\r\n ctx.patchState({\r\n moduleType: action.moduleType,\r\n moduleId: action.moduleId,\r\n parentModuleType: action.parentModuleType ?? null,\r\n parentModuleId: action.parentModuleId ?? null,\r\n parentPath: parentPath ?? '',\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.Reset)\r\n reset(ctx: StateContext<PermissionsStateModel>) {\r\n ctx.patchState({\r\n moduleType: '',\r\n moduleId: '',\r\n parentModuleType: null,\r\n parentModuleId: null,\r\n parentPath: '',\r\n roles: [],\r\n selectedRoleValue: null,\r\n selectedGroupValue: null,\r\n permissions: [],\r\n groupPermissions: [],\r\n });\r\n }\r\n}\r\n","import { inject, Injectable, computed } from '@angular/core';\r\nimport { Store, select } from '@ngxs/store';\r\nimport { PermissionsState } from './permissions.state';\r\nimport * as PermissionsActions from './permissions.actions';\r\nimport { Observable } from 'rxjs';\r\nimport { PermissionsActionKey } from './permissions.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class PermissionsFacade {\r\n private store = inject(Store);\r\n\r\n // ============================================================================\r\n // Data Selectors - Memoized by NGXS (fine-grained reactivity)\r\n // ============================================================================\r\n readonly roles = select(PermissionsState.getRoles);\r\n readonly selectedRoleValue = select(PermissionsState.getSelectedRoleValue);\r\n readonly selectedGroupValue = select(PermissionsState.getSelectedGroupValue);\r\n readonly permissions = select(PermissionsState.getPermissions);\r\n readonly groupPermissions = select(PermissionsState.getGroupPermissions);\r\n readonly moduleType = select(PermissionsState.getModuleType);\r\n readonly moduleId = select(PermissionsState.getModuleId);\r\n readonly levelId = select(PermissionsState.getLevelId);\r\n\r\n // ============================================================================\r\n // Loading/Error Slices - Memoized by NGXS\r\n // ============================================================================\r\n private readonly loadingActive = select(PermissionsState.getLoadingActive);\r\n private readonly errors = select(PermissionsState.getErrors);\r\n\r\n // ============================================================================\r\n // Loading Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly isLoadingRoles = computed(() =>\r\n this.loadingActive().includes(PermissionsActionKey.LoadRoles),\r\n );\r\n readonly isLoadingPermissions = computed(() =>\r\n this.loadingActive().includes(PermissionsActionKey.LoadPermissions),\r\n );\r\n readonly isLoadingGroupPermissions = computed(() =>\r\n this.loadingActive().includes(PermissionsActionKey.LoadGroupPermissions),\r\n );\r\n readonly isUpdatingPermission = computed(() =>\r\n this.loadingActive().includes(PermissionsActionKey.UpdatePermission),\r\n );\r\n readonly isUpdatingGroupPermission = computed(() =>\r\n this.loadingActive().includes(PermissionsActionKey.UpdateGroupPermission),\r\n );\r\n readonly isTogglingLevelPermissions = computed(() =>\r\n this.loadingActive().includes(\r\n PermissionsActionKey.ToggleAllLevelPermissions,\r\n ),\r\n );\r\n readonly isTogglingGroupPermissions = computed(() =>\r\n this.loadingActive().includes(\r\n PermissionsActionKey.ToggleAllGroupPermissions,\r\n ),\r\n );\r\n\r\n // ============================================================================\r\n // Error Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly rolesError = computed(\r\n () => this.errors()[PermissionsActionKey.LoadRoles] ?? null,\r\n );\r\n readonly permissionsError = computed(\r\n () => this.errors()[PermissionsActionKey.LoadPermissions] ?? null,\r\n );\r\n readonly groupPermissionsError = computed(\r\n () => this.errors()[PermissionsActionKey.LoadGroupPermissions] ?? null,\r\n );\r\n readonly updatePermissionError = computed(\r\n () => this.errors()[PermissionsActionKey.UpdatePermission] ?? null,\r\n );\r\n readonly updateGroupPermissionError = computed(\r\n () => this.errors()[PermissionsActionKey.UpdateGroupPermission] ?? null,\r\n );\r\n\r\n // ============================================================================\r\n // Action Dispatchers\r\n // ============================================================================\r\n\r\n loadRoles() {\r\n return this.store.dispatch(new PermissionsActions.LoadRoles());\r\n }\r\n\r\n selectRole(roleValue: string) {\r\n if (roleValue) {\r\n return this.store.dispatch(new PermissionsActions.SelectRole(roleValue));\r\n }\r\n return;\r\n }\r\n\r\n selectGroup(groupId: number) {\r\n if (groupId) {\r\n return this.store.dispatch(new PermissionsActions.SelectGroup(groupId));\r\n }\r\n return;\r\n }\r\n\r\n loadPermissions(roleValue: string, levelId: string) {\r\n return this.store.dispatch(\r\n new PermissionsActions.LoadPermissions(roleValue, levelId),\r\n );\r\n }\r\n\r\n loadGroupPermissions(groupId: number, levelId: string) {\r\n return this.store.dispatch(\r\n new PermissionsActions.LoadGroupPermissions(groupId, levelId),\r\n );\r\n }\r\n\r\n updatePermissionLocally(\r\n roleValue: string,\r\n levelId: string,\r\n actionId: number,\r\n isSelected: boolean,\r\n ) {\r\n return this.store.dispatch(\r\n new PermissionsActions.UpdatePermissionLocally(\r\n roleValue,\r\n levelId,\r\n actionId,\r\n isSelected,\r\n ),\r\n );\r\n }\r\n\r\n updatePermission(roleValue: string, levelId: string) {\r\n return this.store.dispatch(\r\n new PermissionsActions.UpdatePermission(roleValue, levelId),\r\n );\r\n }\r\n updateGroupPermission(groupId: string, levelId: string) {\r\n return this.store.dispatch(\r\n new PermissionsActions.UpdateGroupPermission(groupId, levelId),\r\n );\r\n }\r\n\r\n toggleAllLevelPermissions(\r\n roleValue: string,\r\n levelId: string,\r\n levelName: string,\r\n enabled: boolean,\r\n ) {\r\n return this.store.dispatch(\r\n new PermissionsActions.ToggleAllLevelPermissions(\r\n roleValue,\r\n levelId,\r\n levelName,\r\n enabled,\r\n ),\r\n );\r\n }\r\n toggleAllGroupPermissions(\r\n levelId: string,\r\n groupId: string,\r\n enabled: boolean,\r\n ) {\r\n return this.store.dispatch(\r\n new PermissionsActions.ToggleAllGroupPermissions(\r\n levelId,\r\n groupId,\r\n enabled,\r\n ),\r\n );\r\n }\r\n setModuleInfo(\r\n moduleType: string,\r\n moduleId: string | number,\r\n parentModuleType?: string,\r\n parentModuleId?: string | number,\r\n parentPath?: string,\r\n ): Observable<unknown> {\r\n return this.store.dispatch(\r\n new PermissionsActions.SetModuleInfo(\r\n moduleType,\r\n moduleId,\r\n parentModuleType,\r\n parentModuleId,\r\n parentPath,\r\n ),\r\n );\r\n }\r\n\r\n reset() {\r\n return this.store.dispatch(new PermissionsActions.Reset());\r\n }\r\n}\r\n","import {\r\n Component,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\nimport { PermissionsFacade } from '../../../store/permissions/permissions.facade';\r\nimport {\r\n PermissionLog,\r\n PermissionAction,\r\n} from '../../../store/permissions/permissions.model';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { Button } from '@masterteam/components/button';\r\n\r\n@Component({\r\n selector: 'mt-permissions-edit-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n ToggleField,\r\n TranslocoModule,\r\n FormsModule,\r\n Button,\r\n ],\r\n templateUrl: './permissions-edit-dialog.html',\r\n styleUrl: './permissions-edit-dialog.scss',\r\n})\r\nexport class PermissionsEditDialog {\r\n private permissionsFacade = inject(PermissionsFacade);\r\n modal = inject(ModalService);\r\n ref: ModalRef = inject(ModalRef);\r\n // permissionGroup = input.required<PermissionLog | null>();\r\n permissionGroup = input<PermissionLog | null>(null);\r\n\r\n // Use new facade pattern\r\n addPermissionsLoading = this.permissionsFacade.isUpdatingPermission;\r\n addPermissionsError = this.permissionsFacade.updatePermissionError;\r\n\r\n levelId = input.required<string>();\r\n roleValue = input.required<string>();\r\n isGroup = input.required<boolean>();\r\n\r\n closeDialog = output<void>();\r\n\r\n actionControls = signal<Map<number, FormControl>>(new Map());\r\n toggleAll = signal<boolean>(false);\r\n\r\n constructor() {\r\n effect(() => {\r\n const group = this.permissionGroup();\r\n if (group) {\r\n const controls = new Map<number, FormControl>();\r\n group.actions.forEach((action) => {\r\n const control = new FormControl(action.isSelected);\r\n control.valueChanges.subscribe((value) => {\r\n if (value !== null) {\r\n this.onPermissionToggle(action.id, value);\r\n }\r\n });\r\n controls.set(action.id, control);\r\n });\r\n this.actionControls.set(controls);\r\n this.toggleAll.set(group.actions.every((action) => action.isSelected));\r\n }\r\n });\r\n }\r\n\r\n onPermissionToggle(actionId: number, isSelected: boolean) {\r\n const levelId = this.levelId();\r\n const roleValue = this.roleValue();\r\n if (levelId && roleValue) {\r\n this.permissionsFacade.updatePermissionLocally(\r\n roleValue,\r\n levelId,\r\n actionId,\r\n isSelected,\r\n );\r\n }\r\n }\r\n\r\n onClose() {\r\n // this.closeDialog.emit();\r\n this.ref.close();\r\n }\r\n\r\n trackByActionId(_index: number, action: PermissionAction) {\r\n return action.id;\r\n }\r\n\r\n getControl(actionId: number): FormControl {\r\n return this.actionControls().get(actionId) || new FormControl(false);\r\n }\r\n\r\n onSave(): void {\r\n const levelId = this.levelId();\r\n const roleValue = this.roleValue();\r\n const isGroup = this.isGroup();\r\n if (levelId && roleValue) {\r\n let subscription;\r\n if (isGroup) {\r\n subscription = this.permissionsFacade.updateGroupPermission(\r\n roleValue,\r\n levelId,\r\n );\r\n } else {\r\n subscription = this.permissionsFacade.updatePermission(\r\n roleValue,\r\n levelId,\r\n );\r\n }\r\n subscription.subscribe({\r\n next: () => {\r\n this.onClose();\r\n },\r\n error: (error: any) => {\r\n console.error('Failed to save accessibility permissions:', error);\r\n },\r\n });\r\n }\r\n }\r\n\r\n selectAll() {\r\n const group = this.permissionGroup();\r\n const actions = group?.actions || [];\r\n for (let i = 0; i < actions?.length; i++) {\r\n const control = this.actionControls().get(actions[i].id);\r\n control?.setValue(this.toggleAll());\r\n }\r\n }\r\n}\r\n","<div [class]=\"'flex flex-col gap-3 p-4 ' + modal.contentClass\">\r\n @if (permissionGroup(); as group) {\r\n <div\r\n class=\"flex items-center justify-between border rounded-lg p-3 border-surface mb-4\"\r\n >\r\n <span class=\"text-sm font-medium\">{{\r\n \"permissions.selectAll\" | transloco\r\n }}</span>\r\n <mt-toggle-field\r\n [(ngModel)]=\"toggleAll\"\r\n (onChange)=\"selectAll()\"\r\n ></mt-toggle-field>\r\n </div>\r\n @for (action of group.actions; track trackByActionId($index, action)) {\r\n <div\r\n class=\"flex items-center justify-between border rounded-lg p-3 border-surface\"\r\n >\r\n <span class=\"text-sm font-medium\">{{ action.name?.display }}</span>\r\n <mt-toggle-field\r\n [formControl]=\"getControl(action.id)\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n }\r\n</div>\r\n<div [class]=\"modal.footerClass\">\r\n <mt-button\r\n [label]=\"'save'\"\r\n (click)=\"onSave()\"\r\n [loading]=\"addPermissionsLoading()\"\r\n />\r\n</div>\r\n","import {\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n linkedSignal,\r\n OnDestroy,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { TranslocoModule, TranslocoService } from '@jsverse/transloco';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { PermissionsFacade } from '../../store/permissions/permissions.facade';\r\nimport { PermissionLog } from '../../store/permissions/permissions.model';\r\nimport { PermissionsEditDialog } from './permissions-edit-dialog/permissions-edit-dialog';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { AccessibilitiesFacade } from '@masterteam/accessibilities';\r\n\r\n@Component({\r\n selector: 'mt-permissions-page',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n Card,\r\n Button,\r\n ToggleField,\r\n TranslocoModule,\r\n Avatar,\r\n SkeletonModule,\r\n Tabs,\r\n ],\r\n templateUrl: './permissions-page.html',\r\n styleUrl: './permissions-page.scss',\r\n})\r\nexport default class PermissionsPage implements OnInit, OnDestroy {\r\n private readonly permissionsFacade = inject(PermissionsFacade);\r\n private readonly accessibilitiesFacade: any = inject(AccessibilitiesFacade);\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly router = inject(Router);\r\n private readonly translocoService = inject(TranslocoService);\r\n private readonly modal = inject(ModalService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n private readonly defaultLevelName = 'Project';\r\n\r\n // Use new facade pattern\r\n levelRoles = this.permissionsFacade.roles;\r\n selectedRoleValue = this.permissionsFacade.selectedRoleValue;\r\n selectedRole = linkedSignal(this.selectedRoleValue);\r\n selectedGroupValue = this.permissionsFacade.selectedGroupValue;\r\n selectedGroup = linkedSignal(this.selectedGroupValue);\r\n permissions = this.permissionsFacade.permissions;\r\n loading = this.permissionsFacade.isLoadingRoles;\r\n permissionsLoading = this.permissionsFacade.isLoadingPermissions;\r\n levelId = this.permissionsFacade.levelId;\r\n groups = this.accessibilitiesFacade.groups;\r\n\r\n allPermissionsToggle = new FormControl<boolean>(false);\r\n\r\n readonly groupOrRoleId = computed(() => {\r\n const idParam = this.route.snapshot.firstChild?.paramMap.get('id');\r\n return idParam ? idParam : '';\r\n });\r\n\r\n readonly selectedTabFromParams = computed(() => {\r\n const idParam = this.route.snapshot.firstChild?.data['selectedTab'];\r\n return idParam ? idParam : 'roles';\r\n });\r\n\r\n selectedTab = linkedSignal<string>(this.selectedTabFromParams);\r\n tabsList = signal<any[]>([\r\n {\r\n label: this.translocoService.translate('permissions.roles'),\r\n value: 'roles',\r\n },\r\n {\r\n label: this.translocoService.translate('permissions.groups'),\r\n value: 'groups',\r\n },\r\n ]);\r\n firstLoad = signal(true);\r\n\r\n constructor() {\r\n effect(() => {\r\n const allEnabled = this.isAllPermissionsEnabled();\r\n this.allPermissionsToggle.setValue(allEnabled, { emitEvent: false });\r\n });\r\n effect(() => {\r\n if (this.selectedTab() == 'roles') {\r\n if (this.levelRoles().length == 0) {\r\n if (this.firstLoad() && !this.loading()) {\r\n this.permissionsFacade.loadRoles();\r\n this.firstLoad.set(false);\r\n }\r\n return;\r\n }\r\n }\r\n });\r\n\r\n effect(() => {\r\n if (this.selectedTab() !== 'roles' || this.loading()) {\r\n return;\r\n }\r\n\r\n const roles = this.getRoles();\r\n if (!roles.length) {\r\n return;\r\n }\r\n\r\n const routeRoleValue = this.groupOrRoleId()?.toString();\r\n const selectedRoleValue = this.selectedRoleValue();\r\n const routeRole = routeRoleValue\r\n ? roles.find((role) => role?.value === routeRoleValue)\r\n : null;\r\n\r\n if (routeRole) {\r\n if (selectedRoleValue !== routeRole.value) {\r\n this.selectedRole.set(routeRole.value);\r\n this.permissionsFacade.selectRole(routeRole.value);\r\n }\r\n return;\r\n }\r\n\r\n if (\r\n selectedRoleValue &&\r\n roles.some((role) => role?.value === selectedRoleValue)\r\n ) {\r\n return;\r\n }\r\n\r\n this.selectFirstRole(true);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.permissionsFacade.selectRole('');\r\n this.route.parent?.paramMap\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((params) => {\r\n const levelIdFromRoute = params.get('levelId');\r\n\r\n if (levelIdFromRoute) {\r\n this.permissionsFacade.reset();\r\n this.permissionsFacade.setModuleInfo('level', levelIdFromRoute);\r\n this.permissionsFacade.loadRoles();\r\n }\r\n });\r\n this.permissionsFacade.loadRoles();\r\n this.accessibilitiesFacade.getGroups();\r\n\r\n this.allPermissionsToggle.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((value) => {\r\n if (value !== null) {\r\n this.onToggleAllLevel(this.defaultLevelName, value);\r\n }\r\n });\r\n }\r\n\r\n selectRole(roleValue: string): void {\r\n this.router.navigate(['roles', roleValue], { relativeTo: this.route });\r\n this.permissionsFacade.selectRole(roleValue);\r\n }\r\n\r\n private getRoles() {\r\n return this.levelRoles()\r\n .map((levelRoles) => levelRoles.roles ?? [])\r\n .flat();\r\n }\r\n\r\n private selectFirstRole(replaceUrl = false): void {\r\n const firstRoleValue = this.getRoles()[0]?.value;\r\n\r\n if (!firstRoleValue) {\r\n return;\r\n }\r\n\r\n this.selectedRole.set(firstRoleValue);\r\n this.router.navigate(['roles', firstRoleValue], {\r\n relativeTo: this.route,\r\n replaceUrl,\r\n });\r\n this.permissionsFacade.selectRole(firstRoleValue);\r\n }\r\n\r\n selectGroup(groupId: number): void {\r\n this.router.navigate(['groups', groupId], { relativeTo: this.route });\r\n this.permissionsFacade.selectGroup(groupId);\r\n }\r\n\r\n openPermissionDialog(group: PermissionLog): void {\r\n if (this.levelId() && (this.selectedRoleValue() || this.selectedGroup())) {\r\n this.modal.openModal(PermissionsEditDialog, 'drawer', {\r\n header: this.translocoService.translate('permissions.setPermissions'),\r\n position: 'end',\r\n styleClass: '!w-[24%] !absolute !shadow-none',\r\n appendTo: 'page-content',\r\n inputValues: {\r\n permissionGroup: group,\r\n levelId: this.levelId(),\r\n roleValue:\r\n this.selectedTab() == 'roles'\r\n ? this.selectedRoleValue()\r\n : this.selectedGroup(),\r\n isGroup: this.selectedTab() != 'roles',\r\n },\r\n dismissible: true,\r\n });\r\n }\r\n }\r\n\r\n onToggleAllLevel(levelName: string, enabled: boolean): void {\r\n const levelId = this.levelId();\r\n const roleValue = this.selectedRoleValue();\r\n\r\n if (levelId) {\r\n if (this.selectedTab() != 'roles') {\r\n this.permissionsFacade.toggleAllGroupPermissions(\r\n levelId,\r\n this.selectedGroup()!.toString(),\r\n enabled,\r\n );\r\n return;\r\n } else {\r\n if (!!roleValue) {\r\n this.permissionsFacade.toggleAllLevelPermissions(\r\n roleValue,\r\n levelId,\r\n levelName,\r\n enabled,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n isAllPermissionsEnabled(): boolean {\r\n if (this.permissions().length === 0) return false;\r\n\r\n return this.permissions().every((log) =>\r\n log?.actions.every((action) => action?.isSelected),\r\n );\r\n }\r\n\r\n trackByRoleValue(_index: number, role: any) {\r\n return role.value;\r\n }\r\n\r\n onTabChange($event: any) {\r\n if ($event == 'roles') {\r\n if (this.levelRoles().length) {\r\n this.selectFirstRole();\r\n } else {\r\n this.router.navigate(['roles'], { relativeTo: this.route });\r\n }\r\n } else if ($event == 'groups') {\r\n // Navigate to first group if available\r\n const firstGroup = this.groups()[0];\r\n\r\n if (firstGroup?.id) {\r\n this.router.navigate(['groups', firstGroup.id], {\r\n relativeTo: this.route,\r\n });\r\n this.permissionsFacade.selectGroup(firstGroup.id);\r\n } else {\r\n this.router.navigate(['groups'], { relativeTo: this.route });\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.permissionsFacade.reset();\r\n }\r\n}\r\n","<div id=\"permissions-page-card\" class=\"flex gap-4 p-1\">\r\n <div class=\"w-1/5 flex-shrink-0\">\r\n <mt-card class=\"h-full flex flex-col\">\r\n <ng-template #headless>\r\n <div class=\"flex flex-col h-full\">\r\n <div\r\n class=\"p-4 pb-0 bg-surface-50 rounded-t-2xl border-b border-surface\"\r\n >\r\n <h2 class=\"text-lg font-semibold mb-3\">\r\n {{ \"permissions.rolesAndGroups\" | transloco }}\r\n </h2>\r\n\r\n <mt-tabs\r\n [(active)]=\"selectedTab\"\r\n [options]=\"tabsList()\"\r\n size=\"large\"\r\n (onChange)=\"onTabChange($event)\"\r\n />\r\n </div>\r\n\r\n <div class=\"flex-1 overflow-y-auto p-4\">\r\n @if (loading()) {\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n } @else {\r\n @if (selectedTab() === \"roles\") {\r\n @for (level of levelRoles(); track level) {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n <h2 class=\"font-semibold\">{{ level?.level?.display }}</h2>\r\n @for (role of level.roles; track role.value) {\r\n <div\r\n class=\"p-3 border-2 border-dashed border-gray-300 rounded-lg cursor-pointer transition-colors flex items-center gap-3\"\r\n [class.bg-primary-50]=\"selectedRole() === role.value\"\r\n [class.hover:bg-surface]=\"selectedRole() !== role.value\"\r\n [class.border-primary-400]=\"\r\n selectedRole() === role.value\r\n \"\r\n [style.--p-avatar-background]=\"\r\n selectedRole() === role.value\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedRole() === role.value ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectRole(role.value)\"\r\n >\r\n <mt-avatar [icon]=\"'user.user-check-01'\" shape=\"square\">\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ role.name?.display }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noRolesFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noLevelRolesFound\" | transloco }}\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n @for (group of groups(); track group.name) {\r\n <div\r\n class=\"p-3 border-2 border-dashed border-gray-300 rounded-lg cursor-pointer transition-colors flex items-center gap-3\"\r\n [class.bg-primary-50]=\"selectedGroup() === group.id\"\r\n [class.hover:bg-surface]=\"selectedGroup() !== group.id\"\r\n [class.border-primary-400]=\"selectedGroup() === group.id\"\r\n [style.--p-avatar-background]=\"\r\n selectedGroup() === group.id\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedGroup() === group.id ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectGroup(group.id)\"\r\n >\r\n <mt-avatar [icon]=\"'user.users-check'\" shape=\"square\">\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ group.name?.display }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noGroupsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n\r\n <div class=\"min-w-0 w-1/2\">\r\n @if (!selectedRole() && !selectedGroup()) {\r\n <mt-card class=\"h-full\">\r\n <ng-template #headless>\r\n <div class=\"flex items-center justify-center h-full text-muted-color\">\r\n {{ \"permissions.selectRoleOrGroupToViewPermissions\" | transloco }}\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n } @else {\r\n <mt-card class=\"h-full\">\r\n <div class=\"flex flex-col h-full\">\r\n <ng-template #headless>\r\n <div class=\"p-4 pb-2 mb-5 border-b border-surface\">\r\n <h2 class=\"text-lg font-semibold mb-3\">\r\n {{ \"permissions.permissions\" | transloco }}\r\n </h2>\r\n </div>\r\n @if (permissionsLoading()) {\r\n <div class=\"mx-4\">\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"mb-5 p-3 mx-4 rounded-lg border-1 border-surface flex items-center justify-between\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n [icon]=\"'security.lock-unlocked-01'\"\r\n shape=\"square\"\r\n size=\"large\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"'var(--p-' + 'primary' + '-600)'\"\r\n >\r\n </mt-avatar>\r\n <div>\r\n <div class=\"text-sm font-semibold\">\r\n {{ \"permissions.setAllPermissions\" | transloco }}\r\n </div>\r\n <div class=\"text-xs text-muted-color\">\r\n {{ \"permissions.recommendedForSimpleForms\" | transloco }}\r\n </div>\r\n </div>\r\n </div>\r\n <mt-toggle-field\r\n [formControl]=\"allPermissionsToggle\"\r\n ></mt-toggle-field>\r\n </div>\r\n\r\n <div class=\"flex-1 px-4 overflow-y-auto border-t border-surface\">\r\n <div class=\"space-y-3 my-5\">\r\n @for (group of permissions(); track group.name) {\r\n <div\r\n class=\"p-2 border-1 border-surface rounded-lg flex items-center justify-between hover:bg-surface-100 transition-colors\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n [icon]=\"'editor.dotpoints-02'\"\r\n shape=\"square\"\r\n size=\"normal\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n 'var(--p-' + 'primary' + '-600)'\r\n \"\r\n >\r\n </mt-avatar>\r\n <span class=\"text-sm\">{{ group.name?.display }}</span>\r\n </div>\r\n <mt-button\r\n [text]=\"true\"\r\n icon=\"custom.pencil\"\r\n severity=\"primary\"\r\n (click)=\"openPermissionDialog(group)\"\r\n >\r\n </mt-button>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noPermissionsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n</div>\r\n","// store/index.ts\r\nexport * from './permissions';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["PermissionsActions.LoadPermissions","PermissionsActions.LoadGroupPermissions","PermissionsActions.LoadRoles","PermissionsActions.SelectRole","PermissionsActions.SelectGroup","PermissionsActions.UpdatePermissionLocally","PermissionsActions.UpdatePermission","PermissionsActions.UpdateGroupPermission","PermissionsActions.ToggleAllLevelPermissions","PermissionsActions.ToggleAllGroupPermissions","PermissionsActions.SetModuleInfo","PermissionsActions.Reset","i3"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;IAyEY;AAAZ,CAAA,UAAY,oBAAoB,EAAA;AAC9B,IAAA,oBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,oBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,oBAAA,CAAA,aAAA,CAAA,GAAA,aAA2B;AAC3B,IAAA,oBAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC;AACnC,IAAA,oBAAA,CAAA,sBAAA,CAAA,GAAA,sBAA6C;AAC7C,IAAA,oBAAA,CAAA,kBAAA,CAAA,GAAA,kBAAqC;AACrC,IAAA,oBAAA,CAAA,uBAAA,CAAA,GAAA,uBAA+C;AAC/C,IAAA,oBAAA,CAAA,2BAAA,CAAA,GAAA,2BAAuD;AACvD,IAAA,oBAAA,CAAA,2BAAA,CAAA,GAAA,2BAAuD;AACzD,CAAC,EAVW,oBAAoB,KAApB,oBAAoB,GAAA,EAAA,CAAA,CAAA;IA0BpB;AAAZ,CAAA,UAAY,UAAU,EAAA;AACpB,IAAA,UAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,UAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,UAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EAJW,UAAU,KAAV,UAAU,GAAA,EAAA,CAAA,CAAA;;MCnGT,SAAS,CAAA;AACpB,IAAA,OAAgB,IAAI,GAAG,0BAA0B;AACjD,IAAA,WAAA,GAAA,EAAe;;MAGJ,UAAU,CAAA;AAEF,IAAA,SAAA;AADnB,IAAA,OAAgB,IAAI,GAAG,2BAA2B;AAClD,IAAA,WAAA,CAAmB,SAAiB,EAAA;QAAjB,IAAA,CAAA,SAAS,GAAT,SAAS;IAAW;;MAG5B,WAAW,CAAA;AAEH,IAAA,OAAA;AADnB,IAAA,OAAgB,IAAI,GAAG,4BAA4B;AACnD,IAAA,WAAA,CAAmB,OAAe,EAAA;QAAf,IAAA,CAAA,OAAO,GAAP,OAAO;IAAW;;MAG1B,eAAe,CAAA;AAGjB,IAAA,SAAA;AACA,IAAA,OAAA;AAHT,IAAA,OAAgB,IAAI,GAAG,gCAAgC;IACvD,WAAA,CACS,SAAiB,EACjB,OAAe,EAAA;QADf,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,OAAO,GAAP,OAAO;IACb;;MAGQ,oBAAoB,CAAA;AAGtB,IAAA,OAAA;AACA,IAAA,OAAA;AAHT,IAAA,OAAgB,IAAI,GAAG,sCAAsC;IAC7D,WAAA,CACS,OAAe,EACf,OAAe,EAAA;QADf,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,OAAO,GAAP,OAAO;IACb;;MAGQ,uBAAuB,CAAA;AAGzB,IAAA,SAAA;AACA,IAAA,OAAA;AACA,IAAA,QAAA;AACA,IAAA,UAAA;AALT,IAAA,OAAgB,IAAI,GAAG,yCAAyC;AAChE,IAAA,WAAA,CACS,SAAiB,EACjB,OAAe,EACf,QAAgB,EAChB,UAAmB,EAAA;QAHnB,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,UAAU,GAAV,UAAU;IAChB;;MAGQ,gBAAgB,CAAA;AAGlB,IAAA,SAAA;AACA,IAAA,OAAA;AAHT,IAAA,OAAgB,IAAI,GAAG,iCAAiC;IACxD,WAAA,CACS,SAAiB,EACjB,OAAe,EAAA;QADf,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,OAAO,GAAP,OAAO;IACb;;MAGQ,qBAAqB,CAAA;AAGvB,IAAA,OAAA;AACA,IAAA,OAAA;AAHT,IAAA,OAAgB,IAAI,GAAG,uCAAuC;IAC9D,WAAA,CACS,OAAe,EACf,OAAe,EAAA;QADf,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,OAAO,GAAP,OAAO;IACb;;MAGQ,yBAAyB,CAAA;AAG3B,IAAA,SAAA;AACA,IAAA,OAAA;AACA,IAAA,SAAA;AACA,IAAA,OAAA;AALT,IAAA,OAAgB,IAAI,GAAG,4CAA4C;AACnE,IAAA,WAAA,CACS,SAAiB,EACjB,OAAe,EACf,SAAiB,EACjB,OAAgB,EAAA;QAHhB,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,OAAO,GAAP,OAAO;IACb;;MAGQ,yBAAyB,CAAA;AAG3B,IAAA,OAAA;AACA,IAAA,OAAA;AACA,IAAA,OAAA;AAJT,IAAA,OAAgB,IAAI,GAAG,4CAA4C;AACnE,IAAA,WAAA,CACS,OAAe,EACf,OAAe,EACf,OAAgB,EAAA;QAFhB,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,OAAO,GAAP,OAAO;IACb;;MAGQ,aAAa,CAAA;AAIN,IAAA,UAAA;AACA,IAAA,QAAA;AACA,IAAA,gBAAA;AACA,IAAA,cAAA;AACA,IAAA,UAAA;AAPlB,IAAA,OAAgB,IAAI,GAAG,+BAA+B;IAEtD,WAAA,CACkB,UAAkB,EAClB,QAAyB,EACzB,gBAAyB,EACzB,cAAgC,EAChC,UAAmB,EAAA;QAJnB,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,UAAU,GAAV,UAAU;IACzB;;MAGQ,KAAK,CAAA;AAChB,IAAA,OAAgB,IAAI,GAAG,iCAAiC;AAExD,IAAA,WAAA,GAAA,EAAe;;;;;;;;;ACtDV,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,aAIrC,CAAA;AACS,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;;;;AAO1B,IAAP,OAAO,QAAQ,CAAC,KAA4B,EAAA;QAC1C,OAAO,KAAK,CAAC,KAAK;IACpB;AAGO,IAAP,OAAO,oBAAoB,CAAC,KAA4B,EAAA;QACtD,OAAO,KAAK,CAAC,iBAAiB;IAChC;AAGO,IAAP,OAAO,qBAAqB,CAC1B,KAA4B,EAAA;QAE5B,OAAO,KAAK,CAAC,kBAAkB;IACjC;AAGO,IAAP,OAAO,cAAc,CAAC,KAA4B,EAAA;QAChD,OAAO,KAAK,CAAC,WAAW;IAC1B;AAGO,IAAP,OAAO,mBAAmB,CAAC,KAA4B,EAAA;QACrD,OAAO,KAAK,CAAC,gBAAgB;IAC/B;AAGO,IAAP,OAAO,aAAa,CAAC,KAA4B,EAAA;QAC/C,OAAO,KAAK,CAAC,UAAU;IACzB;AAGO,IAAP,OAAO,WAAW,CAAC,KAA4B,EAAA;QAC7C,OAAO,KAAK,CAAC,QAAQ;IACvB;AAGO,IAAP,OAAO,UAAU,CAAC,KAA4B,EAAA;AAC5C,QAAA,OAAO,KAAK,CAAC,UAAU,KAAK;AAC1B,cAAE,KAAK,CAAC,cAAe,CAAC,QAAQ;AAChC,cAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC/B;;;;AAOO,IAAP,OAAO,gBAAgB,CAAC,KAA4B,EAAA;QAClD,OAAO,KAAK,CAAC,aAAa;IAC5B;AAGO,IAAP,OAAO,SAAS,CACd,KAA4B,EAAA;QAE5B,OAAO,KAAK,CAAC,MAAM;IACrB;;;;;;;AAWA,IAAA,SAAS,CAAC,GAAwC,EAAA;AAChD,QAAA,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE;AAC3D,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;AAC5B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC;AACf,aAAA,GAAG,CACF,CAAA,cAAA,EAAiB,UAAU,GAAG,EAAE,GAAG,SAAS,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAG,UAAU,GAAG,EAAE,GAAG,iBAAiB,CAAA,CAAE;AAE5H,aAAA,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC;AAEzC,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,oBAAoB,CAAC,SAAS;AACnC,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,CAAC,KAAU,MAAM;AAC1B,gBAAA,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK;AACjE,gBAAA,cAAc,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE;aAC1C,CAAC;AACH,SAAA,CAAC;IACJ;;;;IAOA,UAAU,CACR,GAAwC,EACxC,MAAqC,EAAA;AAErC,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;QAC5B,GAAG,CAAC,UAAU,CAAC,EAAE,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;QAEvD,IAAI,KAAK,CAAC,cAAc,IAAI,MAAM,CAAC,SAAS,EAAE;AAC5C,YAAA,GAAG,CAAC,QAAQ,CACV,IAAIA,eAAkC,CACpC,MAAM,CAAC,SAAS,EAChB,KAAK,CAAC,cAAc,CACrB,CACF;QACH;IACF;IAGA,WAAW,CACT,GAAwC,EACxC,MAAsC,EAAA;AAEtC,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;QAC5B,GAAG,CAAC,UAAU,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;AAEtD,QAAA,IAAI,KAAK,CAAC,cAAc,EAAE;AACxB,YAAA,GAAG,CAAC,QAAQ,CACV,IAAIC,oBAAuC,CACzC,MAAM,CAAC,OAAO,EACd,KAAK,CAAC,cAAc,CACrB,CACF;QACH;IACF;IAGA,eAAe,CACb,GAAwC,EACxC,MAA0C,EAAA;AAE1C,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;AAC5B,QAAA,MAAM,UAAU,GACd,KAAK,CAAC,UAAU,KAAK,QAAQ,GAAG,CAAA,OAAA,EAAU,KAAK,CAAC,QAAQ,CAAA,CAAA,CAAG,GAAG,EAAE;AAClE,QAAA,MAAM,OAAO,GACX,KAAK,CAAC,UAAU,KAAK,QAAQ,GAAG,KAAK,CAAC,cAAe,GAAG,KAAK,CAAC,QAAQ;AAExE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC;aACf,GAAG,CACF,CAAA,qBAAA,EAAwB,OAAO,CAAA,CAAA,EAAI,UAAU,GAAG,MAAM,CAAC,SAAS,CAAA,YAAA,CAAc;AAE/E,aAAA,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAEjD,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,oBAAoB,CAAC,eAAe;AACzC,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,CAAC,WAAW,MAAM;gBAC3B,WAAW;aACZ,CAAC;AACH,SAAA,CAAC;IACJ;IAGA,oBAAoB,CAClB,GAAwC,EACxC,MAA+C,EAAA;AAE/C,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;AAC5B,QAAA,MAAM,UAAU,GACd,KAAK,CAAC,UAAU,KAAK,QAAQ,GAAG,CAAA,OAAA,EAAU,KAAK,CAAC,QAAQ,CAAA,CAAA,CAAG,GAAG,EAAE;AAClE,QAAA,MAAM,OAAO,GACX,KAAK,CAAC,UAAU,KAAK,QAAQ,GAAG,KAAK,CAAC,cAAe,GAAG,KAAK,CAAC,QAAQ;AAExE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC;aACf,GAAG,CACF,CAAA,sBAAA,EAAyB,OAAO,CAAA,CAAA,EAAI,UAAU,GAAG,MAAM,CAAC,OAAO,CAAA,YAAA,CAAc;AAE9E,aAAA,IAAI,CAAC,GAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAEtD,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,oBAAoB,CAAC,eAAe;AACzC,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,CAAC,WAAW,MAAM;gBAC3B,WAAW;aACZ,CAAC;AACH,SAAA,CAAC;IACJ;IAGA,uBAAuB,CACrB,GAAwC,EACxC,MAAkD,EAAA;AAElD,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;AAE5B,QAAA,MAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;AACzD,YAAA,GAAG,GAAG;AACN,YAAA,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAC3B,GAAG,CAAC,EAAE,KAAK,MAAM,CAAC;kBACd,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU;kBACvC,GAAG,CACR;AACF,SAAA,CAAC,CAAC;QAEH,GAAG,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IACrD;;;;IAOA,gBAAgB,CACd,GAAwC,EACxC,MAA2C,EAAA;AAE3C,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;QAC5B,MAAM,kBAAkB,GAAU,EAAE;QACpC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,KAAI;YAC/B,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAM,KAAI;AAC5B,gBAAA,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;AACnE,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,OAAO,GACX,KAAK,CAAC,UAAU,KAAK,QAAQ,GAAG,KAAK,CAAC,cAAe,GAAG,KAAK,CAAC,QAAQ;AAExE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CACxB,CAAA,eAAA,EAAkB,MAAM,CAAC,SAAS,oBAAoB,EACtD,EAAE,WAAW,EAAE,kBAAkB,EAAE,EACnC;AACE,YAAA,MAAM,EAAE;gBACN,OAAO;gBACP,SAAS,EAAE,UAAU,CAAC,KAAK;AAC5B,aAAA;AACF,SAAA,CACF;AAED,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,oBAAoB,CAAC,gBAAgB;AAC1C,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,OAAO,EAAE,CAAC;AACrB,YAAA,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAI;;AAE/B,gBAAA,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,WAAW,EAAE;YAClD,CAAC;AACD,YAAA,YAAY,EAAE,6BAA6B;AAC5C,SAAA,CAAC;IACJ;IAGA,qBAAqB,CACnB,GAAwC,EACxC,MAAgD,EAAA;AAEhD,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;QAC5B,MAAM,kBAAkB,GAAU,EAAE;QACpC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,KAAI;YAC/B,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAM,KAAI;AAC5B,gBAAA,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;AACnE,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CACxB,CAAA,gBAAA,EAAmB,MAAM,CAAC,OAAO,CAAA,kBAAA,CAAoB,EACrD,EAAE,WAAW,EAAE,kBAAkB,EAAE,CACpC;AAED,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,oBAAoB,CAAC,qBAAqB;AAC/C,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,OAAO,EAAE,CAAC;AACrB,YAAA,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAI;;AAE/B,gBAAA,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,WAAW,EAAE;YAClD,CAAC;AACD,YAAA,YAAY,EAAE,6BAA6B;AAC5C,SAAA,CAAC;IACJ;IAGA,yBAAyB,CACvB,GAAwC,EACxC,MAAoD,EAAA;AAEpD,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;QAE5B,MAAM,kBAAkB,GAAU,EAAE;QACpC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,KAAI;YAC/B,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAM,KAAI;AAC5B,gBAAA,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;AACpE,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,OAAO,GACX,KAAK,CAAC,UAAU,KAAK,QAAQ,GAAG,KAAK,CAAC,cAAe,GAAG,KAAK,CAAC,QAAQ;AAExE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CACxB,CAAA,eAAA,EAAkB,MAAM,CAAC,SAAS,oBAAoB,EACtD,EAAE,WAAW,EAAE,kBAAkB,EAAE,EACnC;AACE,YAAA,MAAM,EAAE;gBACN,OAAO;gBACP,SAAS,EAAE,UAAU,CAAC,KAAK;AAC5B,aAAA;AACF,SAAA,CACF;AAED,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,oBAAoB,CAAC,yBAAyB;AACnD,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,OAAO,EAAE,CAAC;AACrB,YAAA,OAAO,EAAE,OAAO;gBACd,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B,CAAC;AACF,YAAA,YAAY,EAAE,kCAAkC;AACjD,SAAA,CAAC;IACJ;IAGA,yBAAyB,CACvB,GAAwC,EACxC,MAAoD,EAAA;AAEpD,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;QAE5B,MAAM,kBAAkB,GAAU,EAAE;QACpC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,KAAI;YAC/B,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAM,KAAI;AAC5B,gBAAA,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;AACpE,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CACxB,CAAA,gBAAA,EAAmB,MAAM,CAAC,OAAO,CAAA,kBAAA,CAAoB,EACrD,EAAE,WAAW,EAAE,kBAAkB,EAAE,CACpC;AAED,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,oBAAoB,CAAC,yBAAyB;AACnD,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,OAAO;AAChB,gBAAA,gBAAgB,EAAE,kBAAkB;aACrC,CAAC;AACF,YAAA,OAAO,EAAE,OAAO;gBACd,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;aACzC,CAAC;AACF,YAAA,YAAY,EAAE,kCAAkC;AACjD,SAAA,CAAC;IACJ;IAGA,aAAa,CACX,GAAwC,EACxC,MAAwC,EAAA;QAExC,IAAI,UAAU,GAAG,EAAE;QACnB,IAAI,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,cAAc,EAAE;YACpD,UAAU,GAAG,CAAA,CAAA,EAAI,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,cAAc,CAAA,CAAE;QACrE;AAAO,aAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AAC5B,YAAA,UAAU,GAAG,MAAM,CAAC,UAAU;QAChC;QACA,GAAG,CAAC,UAAU,CAAC;YACb,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;AACzB,YAAA,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,IAAI;AACjD,YAAA,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;YAC7C,UAAU,EAAE,UAAU,IAAI,EAAE;AAC7B,SAAA,CAAC;IACJ;AAGA,IAAA,KAAK,CAAC,GAAwC,EAAA;QAC5C,GAAG,CAAC,UAAU,CAAC;AACb,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,gBAAgB,EAAE,IAAI;AACtB,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,iBAAiB,EAAE,IAAI;AACvB,YAAA,kBAAkB,EAAE,IAAI;AACxB,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,gBAAgB,EAAE,EAAE;AACrB,SAAA,CAAC;IACJ;uGA1YW,gBAAgB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAhB,gBAAgB,EAAA,CAAA;;AAgF3B,UAAA,CAAA;AADC,IAAA,MAAM,CAACC,SAA4B;AAmBnC,CAAA,EAAA,gBAAA,CAAA,SAAA,EAAA,WAAA,EAAA,IAAA,CAAA;AAOD,UAAA,CAAA;AADC,IAAA,MAAM,CAACC,UAA6B;AAgBpC,CAAA,EAAA,gBAAA,CAAA,SAAA,EAAA,YAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;AADC,IAAA,MAAM,CAACC,WAA8B;AAgBrC,CAAA,EAAA,gBAAA,CAAA,SAAA,EAAA,aAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;AADC,IAAA,MAAM,CAACJ,eAAkC;AAyBzC,CAAA,EAAA,gBAAA,CAAA,SAAA,EAAA,iBAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;AADC,IAAA,MAAM,CAACC,oBAAuC;AAyB9C,CAAA,EAAA,gBAAA,CAAA,SAAA,EAAA,sBAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;AADC,IAAA,MAAM,CAACI,uBAA0C;AAiBjD,CAAA,EAAA,gBAAA,CAAA,SAAA,EAAA,yBAAA,EAAA,IAAA,CAAA;AAOD,UAAA,CAAA;AADC,IAAA,MAAM,CAACC,gBAAmC;AAqC1C,CAAA,EAAA,gBAAA,CAAA,SAAA,EAAA,kBAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;AADC,IAAA,MAAM,CAACC,qBAAwC;AA6B/C,CAAA,EAAA,gBAAA,CAAA,SAAA,EAAA,uBAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;AADC,IAAA,MAAM,CAACC,yBAA4C;AAsCnD,CAAA,EAAA,gBAAA,CAAA,SAAA,EAAA,2BAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;AADC,IAAA,MAAM,CAACC,yBAA4C;AA+BnD,CAAA,EAAA,gBAAA,CAAA,SAAA,EAAA,2BAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;AADC,IAAA,MAAM,CAACC,aAAgC;AAkBvC,CAAA,EAAA,gBAAA,CAAA,SAAA,EAAA,eAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;AADC,IAAA,MAAM,CAACC,KAAwB;AAc/B,CAAA,EAAA,gBAAA,CAAA,SAAA,EAAA,OAAA,EAAA,IAAA,CAAA;AA9XM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAKR,CAAA,EAAA,gBAAA,EAAA,uBAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAKR,CAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,IAAA,CAAA;AAOM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAKR,CAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,IAAA,CAAA;AArEU,gBAAgB,GAAA,UAAA,CAAA;AAnB5B,IAAA,KAAK,CAAwB;AAC5B,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,QAAQ,EAAE;AACR,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,iBAAiB,EAAE,IAAI;AACvB,YAAA,kBAAkB,EAAE,IAAI;AACxB,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,gBAAgB,EAAE,EAAE;AACpB,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,gBAAgB,EAAE,IAAI;AACtB,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,UAAU,EAAE,EAAE;YACd,aAAa,EAAE,EAAE;YACjB,MAAM,EAAE,EAAE;AACX,SAAA;KACF;AAEY,CAAA,EAAA,gBAAgB,CA2Y5B;2FA3YY,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B;;;MC5BY,iBAAiB,CAAA;AACpB,IAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;;;;AAKpB,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AACzC,IAAA,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC;AACjE,IAAA,kBAAkB,GAAG,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,CAAC;AACnE,IAAA,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC;AACrD,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;AAC/D,IAAA,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC;AACnD,IAAA,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC;AAC/C,IAAA,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC;;;;AAKrC,IAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,CAAC;AACzD,IAAA,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC;;;;AAKnD,IAAA,cAAc,GAAG,QAAQ,CAAC,MACjC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,SAAS,CAAC,0DAC9D;AACQ,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MACvC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,eAAe,CAAC,gEACpE;AACQ,IAAA,yBAAyB,GAAG,QAAQ,CAAC,MAC5C,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,qEACzE;AACQ,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MACvC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,gEACrE;AACQ,IAAA,yBAAyB,GAAG,QAAQ,CAAC,MAC5C,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,qEAC1E;AACQ,IAAA,0BAA0B,GAAG,QAAQ,CAAC,MAC7C,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAC3B,oBAAoB,CAAC,yBAAyB,CAC/C,sEACF;AACQ,IAAA,0BAA0B,GAAG,QAAQ,CAAC,MAC7C,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAC3B,oBAAoB,CAAC,yBAAyB,CAC/C,sEACF;;;;AAKQ,IAAA,UAAU,GAAG,QAAQ,CAC5B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,IAAI,sDAC5D;AACQ,IAAA,gBAAgB,GAAG,QAAQ,CAClC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,oBAAoB,CAAC,eAAe,CAAC,IAAI,IAAI,4DAClE;AACQ,IAAA,qBAAqB,GAAG,QAAQ,CACvC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,IAAI,IAAI,iEACvE;AACQ,IAAA,qBAAqB,GAAG,QAAQ,CACvC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,IAAI,IAAI,iEACnE;AACQ,IAAA,0BAA0B,GAAG,QAAQ,CAC5C,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,IAAI,IAAI,sEACxE;;;;IAMD,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAIT,SAA4B,EAAE,CAAC;IAChE;AAEA,IAAA,UAAU,CAAC,SAAiB,EAAA;QAC1B,IAAI,SAAS,EAAE;AACb,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAIC,UAA6B,CAAC,SAAS,CAAC,CAAC;QAC1E;QACA;IACF;AAEA,IAAA,WAAW,CAAC,OAAe,EAAA;QACzB,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAIC,WAA8B,CAAC,OAAO,CAAC,CAAC;QACzE;QACA;IACF;IAEA,eAAe,CAAC,SAAiB,EAAE,OAAe,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,IAAIJ,eAAkC,CAAC,SAAS,EAAE,OAAO,CAAC,CAC3D;IACH;IAEA,oBAAoB,CAAC,OAAe,EAAE,OAAe,EAAA;AACnD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,IAAIC,oBAAuC,CAAC,OAAO,EAAE,OAAO,CAAC,CAC9D;IACH;AAEA,IAAA,uBAAuB,CACrB,SAAiB,EACjB,OAAe,EACf,QAAgB,EAChB,UAAmB,EAAA;QAEnB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,IAAII,uBAA0C,CAC5C,SAAS,EACT,OAAO,EACP,QAAQ,EACR,UAAU,CACX,CACF;IACH;IAEA,gBAAgB,CAAC,SAAiB,EAAE,OAAe,EAAA;AACjD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,IAAIC,gBAAmC,CAAC,SAAS,EAAE,OAAO,CAAC,CAC5D;IACH;IACA,qBAAqB,CAAC,OAAe,EAAE,OAAe,EAAA;AACpD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,IAAIC,qBAAwC,CAAC,OAAO,EAAE,OAAO,CAAC,CAC/D;IACH;AAEA,IAAA,yBAAyB,CACvB,SAAiB,EACjB,OAAe,EACf,SAAiB,EACjB,OAAgB,EAAA;QAEhB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,IAAIC,yBAA4C,CAC9C,SAAS,EACT,OAAO,EACP,SAAS,EACT,OAAO,CACR,CACF;IACH;AACA,IAAA,yBAAyB,CACvB,OAAe,EACf,OAAe,EACf,OAAgB,EAAA;AAEhB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,IAAIC,yBAA4C,CAC9C,OAAO,EACP,OAAO,EACP,OAAO,CACR,CACF;IACH;IACA,aAAa,CACX,UAAkB,EAClB,QAAyB,EACzB,gBAAyB,EACzB,cAAgC,EAChC,UAAmB,EAAA;QAEnB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,IAAIC,aAAgC,CAClC,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,UAAU,CACX,CACF;IACH;IAEA,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAIC,KAAwB,EAAE,CAAC;IAC5D;uGAlLW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA;;2FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MC4BrB,qBAAqB,CAAA;AACxB,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACrD,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAC5B,IAAA,GAAG,GAAa,MAAM,CAAC,QAAQ,CAAC;;AAEhC,IAAA,eAAe,GAAG,KAAK,CAAuB,IAAI,2DAAC;;AAGnD,IAAA,qBAAqB,GAAG,IAAI,CAAC,iBAAiB,CAAC,oBAAoB;AACnE,IAAA,mBAAmB,GAAG,IAAI,CAAC,iBAAiB,CAAC,qBAAqB;AAElE,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,kDAAU;AAClC,IAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,oDAAU;AACpC,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,kDAAW;IAEnC,WAAW,GAAG,MAAM,EAAQ;AAE5B,IAAA,cAAc,GAAG,MAAM,CAA2B,IAAI,GAAG,EAAE,0DAAC;AAC5D,IAAA,SAAS,GAAG,MAAM,CAAU,KAAK,qDAAC;AAElC,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;YACpC,IAAI,KAAK,EAAE;AACT,gBAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB;gBAC/C,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;oBAC/B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC;oBAClD,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AACvC,wBAAA,IAAI,KAAK,KAAK,IAAI,EAAE;4BAClB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC;wBAC3C;AACF,oBAAA,CAAC,CAAC;oBACF,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC;AAClC,gBAAA,CAAC,CAAC;AACF,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC;YACxE;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,kBAAkB,CAAC,QAAgB,EAAE,UAAmB,EAAA;AACtD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,QAAA,IAAI,OAAO,IAAI,SAAS,EAAE;AACxB,YAAA,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAC5C,SAAS,EACT,OAAO,EACP,QAAQ,EACR,UAAU,CACX;QACH;IACF;IAEA,OAAO,GAAA;;AAEL,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;IAClB;IAEA,eAAe,CAAC,MAAc,EAAE,MAAwB,EAAA;QACtD,OAAO,MAAM,CAAC,EAAE;IAClB;AAEA,IAAA,UAAU,CAAC,QAAgB,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC;IACtE;IAEA,MAAM,GAAA;AACJ,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,IAAI,OAAO,IAAI,SAAS,EAAE;AACxB,YAAA,IAAI,YAAY;YAChB,IAAI,OAAO,EAAE;gBACX,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CACzD,SAAS,EACT,OAAO,CACR;YACH;iBAAO;gBACL,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CACpD,SAAS,EACT,OAAO,CACR;YACH;YACA,YAAY,CAAC,SAAS,CAAC;gBACrB,IAAI,EAAE,MAAK;oBACT,IAAI,CAAC,OAAO,EAAE;gBAChB,CAAC;AACD,gBAAA,KAAK,EAAE,CAAC,KAAU,KAAI;AACpB,oBAAA,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC;gBACnE,CAAC;AACF,aAAA,CAAC;QACJ;IACF;IAEA,SAAS,GAAA;AACP,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,EAAE;AACpC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC;IACF;uGArGW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnClC,mkCAgCA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDPI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,WAAW,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,eAAA,EAAA,aAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,WAAW,uPACX,MAAM,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAKG,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAdjC,SAAS;+BACE,4BAA4B,EAAA,UAAA,EAC1B,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;wBACX,eAAe;wBACf,WAAW;wBACX,MAAM;AACP,qBAAA,EAAA,QAAA,EAAA,mkCAAA,EAAA;;;AEaW,MAAO,eAAe,CAAA;AACjB,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC7C,IAAA,qBAAqB,GAAQ,MAAM,CAAC,qBAAqB,CAAC;AAC1D,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAC5B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAE/B,gBAAgB,GAAG,SAAS;;AAG7C,IAAA,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK;AACzC,IAAA,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,iBAAiB;AAC5D,IAAA,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,iBAAiB,wDAAC;AACnD,IAAA,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,CAAC,kBAAkB;AAC9D,IAAA,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,kBAAkB,yDAAC;AACrD,IAAA,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW;AAChD,IAAA,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc;AAC/C,IAAA,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,CAAC,oBAAoB;AAChE,IAAA,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO;AACxC,IAAA,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM;AAE1C,IAAA,oBAAoB,GAAG,IAAI,WAAW,CAAU,KAAK,CAAC;AAE7C,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAClE,OAAO,OAAO,GAAG,OAAO,GAAG,EAAE;AAC/B,IAAA,CAAC,yDAAC;AAEO,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;QACnE,OAAO,OAAO,GAAG,OAAO,GAAG,OAAO;AACpC,IAAA,CAAC,iEAAC;AAEF,IAAA,WAAW,GAAG,YAAY,CAAS,IAAI,CAAC,qBAAqB,uDAAC;IAC9D,QAAQ,GAAG,MAAM,CAAQ;AACvB,QAAA;YACE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,mBAAmB,CAAC;AAC3D,YAAA,KAAK,EAAE,OAAO;AACf,SAAA;AACD,QAAA;YACE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,oBAAoB,CAAC;AAC5D,YAAA,KAAK,EAAE,QAAQ;AAChB,SAAA;AACF,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACF,IAAA,SAAS,GAAG,MAAM,CAAC,IAAI,qDAAC;AAExB,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,uBAAuB,EAAE;AACjD,YAAA,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACtE,QAAA,CAAC,CAAC;QACF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,OAAO,EAAE;gBACjC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE;oBACjC,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;AACvC,wBAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE;AAClC,wBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;oBAC3B;oBACA;gBACF;YACF;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;gBACpD;YACF;AAEA,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;gBACjB;YACF;YAEA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE;AACvD,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE;YAClD,MAAM,SAAS,GAAG;AAChB,kBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,KAAK,KAAK,cAAc;kBACnD,IAAI;YAER,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,iBAAiB,KAAK,SAAS,CAAC,KAAK,EAAE;oBACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC;oBACtC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC;gBACpD;gBACA;YACF;AAEA,YAAA,IACE,iBAAiB;AACjB,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,KAAK,KAAK,iBAAiB,CAAC,EACvD;gBACA;YACF;AAEA,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC5B,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;AACrC,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AAChB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,MAAM,KAAI;YACpB,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;YAE9C,IAAI,gBAAgB,EAAE;AACpB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE;gBAC9B,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,OAAO,EAAE,gBAAgB,CAAC;AAC/D,gBAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE;YACpC;AACF,QAAA,CAAC,CAAC;AACJ,QAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE;AAClC,QAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE;QAEtC,IAAI,CAAC,oBAAoB,CAAC;AACvB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,IAAI,KAAK,KAAK,IAAI,EAAE;gBAClB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC;YACrD;AACF,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,UAAU,CAAC,SAAiB,EAAA;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACtE,QAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC;IAC9C;IAEQ,QAAQ,GAAA;QACd,OAAO,IAAI,CAAC,UAAU;aACnB,GAAG,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,KAAK,IAAI,EAAE;AAC1C,aAAA,IAAI,EAAE;IACX;IAEQ,eAAe,CAAC,UAAU,GAAG,KAAK,EAAA;QACxC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK;QAEhD,IAAI,CAAC,cAAc,EAAE;YACnB;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE;YAC9C,UAAU,EAAE,IAAI,CAAC,KAAK;YACtB,UAAU;AACX,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,cAAc,CAAC;IACnD;AAEA,IAAA,WAAW,CAAC,OAAe,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACrE,QAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,OAAO,CAAC;IAC7C;AAEA,IAAA,oBAAoB,CAAC,KAAoB,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE;YACxE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,EAAE,QAAQ,EAAE;gBACpD,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,4BAA4B,CAAC;AACrE,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,UAAU,EAAE,iCAAiC;AAC7C,gBAAA,QAAQ,EAAE,cAAc;AACxB,gBAAA,WAAW,EAAE;AACX,oBAAA,eAAe,EAAE,KAAK;AACtB,oBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,oBAAA,SAAS,EACP,IAAI,CAAC,WAAW,EAAE,IAAI;AACpB,0BAAE,IAAI,CAAC,iBAAiB;AACxB,0BAAE,IAAI,CAAC,aAAa,EAAE;AAC1B,oBAAA,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,OAAO;AACvC,iBAAA;AACD,gBAAA,WAAW,EAAE,IAAI;AAClB,aAAA,CAAC;QACJ;IACF;IAEA,gBAAgB,CAAC,SAAiB,EAAE,OAAgB,EAAA;AAClD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE;QAE1C,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,OAAO,EAAE;AACjC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAC9C,OAAO,EACP,IAAI,CAAC,aAAa,EAAG,CAAC,QAAQ,EAAE,EAChC,OAAO,CACR;gBACD;YACF;iBAAO;AACL,gBAAA,IAAI,CAAC,CAAC,SAAS,EAAE;AACf,oBAAA,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAC9C,SAAS,EACT,OAAO,EACP,SAAS,EACT,OAAO,CACR;gBACH;YACF;QACF;IACF;IAEA,uBAAuB,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AAEjD,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,KAClC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,UAAU,CAAC,CACnD;IACH;IAEA,gBAAgB,CAAC,MAAc,EAAE,IAAS,EAAA;QACxC,OAAO,IAAI,CAAC,KAAK;IACnB;AAEA,IAAA,WAAW,CAAC,MAAW,EAAA;AACrB,QAAA,IAAI,MAAM,IAAI,OAAO,EAAE;AACrB,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE;gBAC5B,IAAI,CAAC,eAAe,EAAE;YACxB;iBAAO;AACL,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7D;QACF;AAAO,aAAA,IAAI,MAAM,IAAI,QAAQ,EAAE;;YAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAEnC,YAAA,IAAI,UAAU,EAAE,EAAE,EAAE;AAClB,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE;oBAC9C,UAAU,EAAE,IAAI,CAAC,KAAK;AACvB,iBAAA,CAAC;gBACF,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YACnD;iBAAO;AACL,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9D;QACF;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE;IAChC;uGA9OmB,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,+EC5CpC,k8SAmNA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpLI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,0TACnB,IAAI,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,MAAM,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,WAAW,0NACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,MAAM,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,WAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACN,cAAc,4LACd,IAAI,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAKa,eAAe,EAAA,UAAA,EAAA,CAAA;kBAhBnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,OAAA,EACtB;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,IAAI;wBACJ,MAAM;wBACN,WAAW;wBACX,eAAe;wBACf,MAAM;wBACN,cAAc;wBACd,IAAI;AACL,qBAAA,EAAA,QAAA,EAAA,k8SAAA,EAAA;;;AExCH;;ACAA;;AAEG;;;;"}
1
+ {"version":3,"file":"masterteam-permissions.mjs","sources":["../../../../packages/masterteam/permissions/src/store/permissions/permissions.model.ts","../../../../packages/masterteam/permissions/src/store/permissions/permissions.actions.ts","../../../../packages/masterteam/permissions/src/store/permissions/permissions.state.ts","../../../../packages/masterteam/permissions/src/store/permissions/permissions.facade.ts","../../../../packages/masterteam/permissions/src/lib/permissions-page/permissions-edit-dialog/permissions-edit-dialog.ts","../../../../packages/masterteam/permissions/src/lib/permissions-page/permissions-edit-dialog/permissions-edit-dialog.html","../../../../packages/masterteam/permissions/src/lib/permissions-page/permissions-page.ts","../../../../packages/masterteam/permissions/src/lib/permissions-page/permissions-page.html","../../../../packages/masterteam/permissions/src/store/index.ts","../../../../packages/masterteam/permissions/src/masterteam-permissions.ts"],"sourcesContent":["import { LoadingStateShape } from '../utils/state-helpers';\r\n\r\nexport interface Role {\r\n name: string;\r\n value: string;\r\n}\r\nexport interface LevelRoles {\r\n level?: string;\r\n levelKey?: string;\r\n scopeType?: string;\r\n scopeId?: string;\r\n roles?: Role[];\r\n}\r\n\r\nexport interface PermissionAction {\r\n id: number;\r\n name: string;\r\n isSelected: boolean;\r\n}\r\n\r\nexport interface PermissionLog {\r\n name: string;\r\n actions: PermissionAction[];\r\n}\r\n\r\nexport interface LevelPermission {\r\n levelName: string;\r\n modules: PermissionLog[];\r\n}\r\n\r\nexport interface RolesResponse {\r\n endpoint: string;\r\n status: number;\r\n code: number;\r\n locale: string;\r\n message: string;\r\n errors: null | string[];\r\n data: LevelRoles[];\r\n cacheSession: string;\r\n}\r\n\r\nexport interface PermissionsResponseData {\r\n modules: PermissionLog[];\r\n}\r\n\r\nexport interface PermissionsResponse {\r\n endpoint: string;\r\n status: number;\r\n code: number;\r\n locale: string;\r\n message: string;\r\n errors: null | string[];\r\n data: PermissionsResponseData;\r\n cacheSession: string;\r\n}\r\n\r\nexport interface GroupPermissionsResponse {\r\n endpoint: string;\r\n status: number;\r\n code: number;\r\n locale: string;\r\n message: string;\r\n errors: null | string[];\r\n data: LevelPermission[];\r\n cacheSession: string;\r\n}\r\n\r\nexport interface UpdatePermissionPayload {\r\n roleValue: string;\r\n levelId: string;\r\n permissions: LevelPermission[];\r\n}\r\n\r\nexport enum PermissionsActionKey {\r\n LoadRoles = 'loadRoles',\r\n SelectRole = 'selectRole',\r\n SelectGroup = 'selectGroup',\r\n LoadPermissions = 'loadPermissions',\r\n LoadGroupPermissions = 'loadGroupPermissions',\r\n UpdatePermission = 'updatePermission',\r\n UpdateGroupPermission = 'updateGroupPermission',\r\n ToggleAllLevelPermissions = 'toggleAllLevelPermissions',\r\n ToggleAllGroupPermissions = 'toggleAllGroupPermissions',\r\n}\r\n\r\nexport interface PermissionsStateModel extends LoadingStateShape<PermissionsActionKey> {\r\n roles: LevelRoles[];\r\n selectedRoleValue: string | null;\r\n selectedGroupValue: string | number | null;\r\n permissions: PermissionLog[];\r\n groupPermissions: LevelPermission[];\r\n currentLevelId: string | null;\r\n moduleType: string;\r\n moduleId: string | number;\r\n parentModuleType?: string | null;\r\n parentModuleId?: string | number | null;\r\n parentPath?: string;\r\n}\r\n\r\nexport enum ModuleType {\r\n MODULE = 'module',\r\n LEVEL = 'level',\r\n LOG = 'log',\r\n LEVELLOG = 'levelLog',\r\n}\r\n","export class LoadRoles {\r\n static readonly type = '[Permissions] Load Roles';\r\n constructor() {}\r\n}\r\n\r\nexport class SelectRole {\r\n static readonly type = '[Permissions] Select Role';\r\n constructor(public roleValue: string) {}\r\n}\r\n\r\nexport class SelectGroup {\r\n static readonly type = '[Permissions] Select Group';\r\n constructor(public groupId: number) {}\r\n}\r\n\r\nexport class LoadPermissions {\r\n static readonly type = '[Permissions] Load Permissions';\r\n constructor(\r\n public roleValue: string,\r\n public levelId: string,\r\n ) {}\r\n}\r\n\r\nexport class LoadGroupPermissions {\r\n static readonly type = '[Permissions] Load Group Permissions';\r\n constructor(\r\n public groupId: number,\r\n public levelId: string,\r\n ) {}\r\n}\r\n\r\nexport class UpdatePermissionLocally {\r\n static readonly type = '[Permissions] Update Permission Locally';\r\n constructor(\r\n public roleValue: string,\r\n public levelId: string,\r\n public actionId: number,\r\n public isSelected: boolean,\r\n ) {}\r\n}\r\n\r\nexport class UpdatePermission {\r\n static readonly type = '[Permissions] Update Permission';\r\n constructor(\r\n public roleValue: string,\r\n public levelId: string,\r\n ) {}\r\n}\r\n\r\nexport class UpdateGroupPermission {\r\n static readonly type = '[Permissions] Update Group Permission';\r\n constructor(\r\n public groupId: string,\r\n public levelId: string,\r\n ) {}\r\n}\r\n\r\nexport class ToggleAllLevelPermissions {\r\n static readonly type = '[Permissions] Toggle All Level Permissions';\r\n constructor(\r\n public roleValue: string,\r\n public levelId: string,\r\n public levelName: string,\r\n public enabled: boolean,\r\n ) {}\r\n}\r\n\r\nexport class ToggleAllGroupPermissions {\r\n static readonly type = '[Permissions] Toggle All Group Permissions';\r\n constructor(\r\n public levelId: string,\r\n public groupId: string,\r\n public enabled: boolean,\r\n ) {}\r\n}\r\n\r\nexport class SetModuleInfo {\r\n static readonly type = '[Permissions] Set Module Info';\r\n\r\n constructor(\r\n public readonly moduleType: string,\r\n public readonly moduleId: string | number,\r\n public readonly parentModuleType?: string,\r\n public readonly parentModuleId?: string | number,\r\n public readonly parentPath?: string,\r\n ) {}\r\n}\r\n\r\nexport class Reset {\r\n static readonly type = '[Permissions] Reset Module Info';\r\n\r\n constructor() {}\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport { map } from 'rxjs';\r\nimport { CrudStateBase, handleApiRequest } from '@masterteam/components';\r\nimport {\r\n GroupPermissionsResponse,\r\n LevelPermission,\r\n LevelRoles,\r\n ModuleType,\r\n PermissionLog,\r\n PermissionsResponse,\r\n PermissionsActionKey,\r\n PermissionsStateModel,\r\n RolesResponse,\r\n} from './permissions.model';\r\nimport * as PermissionsActions from './permissions.actions';\r\n\r\n@State<PermissionsStateModel>({\r\n name: 'permissions',\r\n defaults: {\r\n roles: [],\r\n selectedRoleValue: null,\r\n selectedGroupValue: null,\r\n permissions: [],\r\n groupPermissions: [],\r\n currentLevelId: null,\r\n moduleType: '',\r\n moduleId: '',\r\n parentModuleType: null,\r\n parentModuleId: null,\r\n parentPath: '',\r\n loadingActive: [], // Required by LoadingStateShape\r\n errors: {}, // Required by LoadingStateShape\r\n },\r\n})\r\n@Injectable()\r\nexport class PermissionsState extends CrudStateBase<\r\n LevelRoles,\r\n PermissionsStateModel,\r\n PermissionsActionKey\r\n> {\r\n private http = inject(HttpClient);\r\n\r\n // ============================================================================\r\n // Data Selectors - Individual for fine-grained reactivity\r\n // ============================================================================\r\n\r\n @Selector()\r\n static getRoles(state: PermissionsStateModel): LevelRoles[] {\r\n return state.roles;\r\n }\r\n\r\n @Selector()\r\n static getSelectedRoleValue(state: PermissionsStateModel): string | null {\r\n return state.selectedRoleValue;\r\n }\r\n\r\n @Selector()\r\n static getSelectedGroupValue(\r\n state: PermissionsStateModel,\r\n ): string | number | null {\r\n return state.selectedGroupValue;\r\n }\r\n\r\n @Selector()\r\n static getPermissions(state: PermissionsStateModel): PermissionLog[] {\r\n return state.permissions;\r\n }\r\n\r\n @Selector()\r\n static getGroupPermissions(state: PermissionsStateModel): LevelPermission[] {\r\n return state.groupPermissions;\r\n }\r\n\r\n @Selector()\r\n static getModuleType(state: PermissionsStateModel): string {\r\n return state.moduleType;\r\n }\r\n\r\n @Selector()\r\n static getModuleId(state: PermissionsStateModel): string | number {\r\n return state.moduleId;\r\n }\r\n\r\n @Selector()\r\n static getLevelId(state: PermissionsStateModel): string {\r\n const scopeId = resolveActiveScopeId(state);\r\n return scopeId != null ? scopeId.toString() : '';\r\n }\r\n\r\n // ============================================================================\r\n // Loading/Error Slice Selectors - REQUIRED for optimal performance\r\n // ============================================================================\r\n\r\n @Selector()\r\n static getLoadingActive(state: PermissionsStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: PermissionsStateModel,\r\n ): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n // ============================================================================\r\n // CRUD Actions\r\n // ============================================================================\r\n\r\n // ============================================================================\r\n // CRUD Actions\r\n // ============================================================================\r\n\r\n @Action(PermissionsActions.LoadRoles)\r\n loadRoles(ctx: StateContext<PermissionsStateModel>) {\r\n const { moduleType, moduleId, parentPath } = ctx.getState();\r\n const state = ctx.getState();\r\n const req$ = this.http\r\n .get<RolesResponse>(\r\n `identity/roles${parentPath ? '' : '/scopes'}${parentPath}/${moduleType}/${moduleId}${parentPath ? '' : '?inherited=true'}`,\r\n )\r\n .pipe(map((response) => response.data));\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.LoadRoles,\r\n request$: req$,\r\n onSuccess: (roles: any) => ({\r\n roles: state.moduleType === 'module' ? [{ roles: roles }] : roles,\r\n currentLevelId: resolveActiveScopeId(state)?.toString() ?? null,\r\n }),\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Simple State Updates (No HTTP)\r\n // ============================================================================\r\n\r\n @Action(PermissionsActions.SelectRole)\r\n selectRole(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.SelectRole,\r\n ) {\r\n const state = ctx.getState();\r\n ctx.patchState({ selectedRoleValue: action.roleValue });\r\n\r\n if (state.currentLevelId && action.roleValue) {\r\n ctx.dispatch(\r\n new PermissionsActions.LoadPermissions(\r\n action.roleValue,\r\n state.currentLevelId,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n @Action(PermissionsActions.SelectGroup)\r\n selectGroup(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.SelectGroup,\r\n ) {\r\n const state = ctx.getState();\r\n ctx.patchState({ selectedGroupValue: action.groupId });\r\n\r\n if (state.currentLevelId) {\r\n ctx.dispatch(\r\n new PermissionsActions.LoadGroupPermissions(\r\n action.groupId,\r\n state.currentLevelId,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n @Action(PermissionsActions.LoadPermissions)\r\n loadPermissions(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.LoadPermissions,\r\n ) {\r\n const state = ctx.getState();\r\n const scopePath = resolvePermissionScopePath(state);\r\n\r\n const req$ = this.http\r\n .get<PermissionsResponse>(\r\n `identity/roles/${scopePath}/${action.roleValue}/permissions`,\r\n )\r\n .pipe(map((response) => response.data.modules));\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.LoadPermissions,\r\n request$: req$,\r\n onSuccess: (permissions) => ({\r\n permissions,\r\n }),\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.LoadGroupPermissions)\r\n loadGroupPermissions(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.LoadGroupPermissions,\r\n ) {\r\n const state = ctx.getState();\r\n const scopePath = resolvePermissionScopePath(state);\r\n\r\n const req$ = this.http\r\n .get<GroupPermissionsResponse>(\r\n `identity/groups/${scopePath}/${action.groupId}/permissions`,\r\n )\r\n .pipe(map((response: any) => response.data.modules));\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.LoadPermissions,\r\n request$: req$,\r\n onSuccess: (permissions) => ({\r\n permissions,\r\n }),\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.UpdatePermissionLocally)\r\n updatePermissionLocally(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.UpdatePermissionLocally,\r\n ) {\r\n const state = ctx.getState();\r\n\r\n const updatedPermissions = state.permissions.map((log) => ({\r\n ...log,\r\n actions: log.actions.map((act) =>\r\n act.id === action.actionId\r\n ? { ...act, isSelected: action.isSelected }\r\n : act,\r\n ),\r\n }));\r\n\r\n ctx.patchState({ permissions: updatedPermissions });\r\n }\r\n\r\n // ============================================================================\r\n // Complex Operations - use handleApiRequest for transformations\r\n // ============================================================================\r\n\r\n @Action(PermissionsActions.UpdatePermission)\r\n updatePermission(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.UpdatePermission,\r\n ) {\r\n const state = ctx.getState();\r\n const updatedPermissions: any[] = [];\r\n state.permissions?.forEach((p) => {\r\n p?.actions.forEach((a: any) => {\r\n updatedPermissions.push({ id: a?.id, isSelected: a?.isSelected });\r\n });\r\n });\r\n const { scopeId, scopeType } = resolvePermissionMutationScope(state);\r\n\r\n const req$ = this.http.put<PermissionsResponse>(\r\n `identity/roles/${action.roleValue}/setAllPermissions`,\r\n { permissions: updatedPermissions },\r\n {\r\n params: {\r\n scopeId,\r\n scopeType,\r\n },\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.UpdatePermission,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n onError: (error, currentState) => {\r\n // Rollback on error\r\n return { permissions: currentState.permissions };\r\n },\r\n errorMessage: 'Failed to update permission',\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.UpdateGroupPermission)\r\n updateGroupPermission(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.UpdateGroupPermission,\r\n ) {\r\n const state = ctx.getState();\r\n const updatedPermissions: any[] = [];\r\n state.permissions?.forEach((p) => {\r\n p?.actions.forEach((a: any) => {\r\n updatedPermissions.push({ id: a?.id, isSelected: a?.isSelected });\r\n });\r\n });\r\n\r\n const req$ = this.http.put<PermissionsResponse>(\r\n `identity/groups/${action.groupId}/setAllPermissions`,\r\n { permissions: updatedPermissions },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.UpdateGroupPermission,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n onError: (error, currentState) => {\r\n // Rollback on error\r\n return { permissions: currentState.permissions };\r\n },\r\n errorMessage: 'Failed to update permission',\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.ToggleAllLevelPermissions)\r\n toggleAllLevelPermissions(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.ToggleAllLevelPermissions,\r\n ) {\r\n const state = ctx.getState();\r\n\r\n const updatedPermissions: any[] = [];\r\n state.permissions?.forEach((p) => {\r\n p?.actions.forEach((a: any) => {\r\n updatedPermissions.push({ id: a?.id, isSelected: action.enabled });\r\n });\r\n });\r\n\r\n const { scopeId, scopeType } = resolvePermissionMutationScope(state);\r\n\r\n const req$ = this.http.put<PermissionsResponse>(\r\n `identity/roles/${action.roleValue}/setAllPermissions`,\r\n { permissions: updatedPermissions },\r\n {\r\n params: {\r\n scopeId,\r\n scopeType,\r\n },\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.ToggleAllLevelPermissions,\r\n request$: req$,\r\n onSuccess: () => ({}),\r\n onError: () => ({\r\n permissions: state.permissions,\r\n }),\r\n errorMessage: 'Failed to toggle all permissions',\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.ToggleAllGroupPermissions)\r\n toggleAllGroupPermissions(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.ToggleAllGroupPermissions,\r\n ) {\r\n const state = ctx.getState();\r\n\r\n const updatedPermissions: any[] = [];\r\n state.permissions?.forEach((p) => {\r\n p?.actions.forEach((a: any) => {\r\n updatedPermissions.push({ id: a?.id, isSelected: action.enabled });\r\n });\r\n });\r\n\r\n const req$ = this.http.put<PermissionsResponse>(\r\n `identity/groups/${action.groupId}/setAllPermissions`,\r\n { permissions: updatedPermissions },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: PermissionsActionKey.ToggleAllGroupPermissions,\r\n request$: req$,\r\n onSuccess: () => ({\r\n permissions: state.permissions.map((permissionGroup) => ({\r\n ...permissionGroup,\r\n actions: permissionGroup.actions.map((permission) => ({\r\n ...permission,\r\n isSelected: action.enabled,\r\n })),\r\n })),\r\n }),\r\n onError: () => ({\r\n permissions: state.permissions,\r\n }),\r\n errorMessage: 'Failed to toggle all permissions',\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.SetModuleInfo)\r\n setModuleInfo(\r\n ctx: StateContext<PermissionsStateModel>,\r\n action: PermissionsActions.SetModuleInfo,\r\n ) {\r\n let parentPath = '';\r\n if (action.parentModuleType && action.parentModuleId) {\r\n parentPath = `/${action.parentModuleType}/${action.parentModuleId}`;\r\n } else if (action.parentPath) {\r\n parentPath = action.parentPath;\r\n }\r\n ctx.patchState({\r\n moduleType: action.moduleType,\r\n moduleId: action.moduleId,\r\n parentModuleType: action.parentModuleType ?? null,\r\n parentModuleId: action.parentModuleId ?? null,\r\n parentPath: parentPath ?? '',\r\n });\r\n }\r\n\r\n @Action(PermissionsActions.Reset)\r\n reset(ctx: StateContext<PermissionsStateModel>) {\r\n ctx.patchState({\r\n moduleType: '',\r\n moduleId: '',\r\n parentModuleType: null,\r\n parentModuleId: null,\r\n parentPath: '',\r\n roles: [],\r\n selectedRoleValue: null,\r\n selectedGroupValue: null,\r\n permissions: [],\r\n groupPermissions: [],\r\n });\r\n }\r\n}\r\n\r\nfunction hasParentScope(state: PermissionsStateModel): boolean {\r\n return (\r\n state.parentModuleId !== null &&\r\n state.parentModuleId !== undefined &&\r\n state.parentModuleId !== ''\r\n );\r\n}\r\n\r\nfunction resolveActiveScopeId(\r\n state: PermissionsStateModel,\r\n): string | number | null {\r\n if (state.moduleType === 'module') {\r\n return hasParentScope(state) ? state.parentModuleId! : state.moduleId;\r\n }\r\n\r\n return state.moduleId;\r\n}\r\n\r\nfunction resolvePermissionMutationScope(state: PermissionsStateModel): {\r\n scopeId: string | number;\r\n scopeType: ModuleType;\r\n} {\r\n if (state.moduleType === 'module' && !hasParentScope(state)) {\r\n return {\r\n scopeId: state.moduleId,\r\n scopeType: ModuleType.MODULE,\r\n };\r\n }\r\n\r\n return {\r\n scopeId: resolveActiveScopeId(state) ?? '',\r\n scopeType: ModuleType.LEVEL,\r\n };\r\n}\r\n\r\nfunction resolvePermissionScopePath(state: PermissionsStateModel): string {\r\n return `${state.parentPath ?? ''}/${state.moduleType}/${state.moduleId}`\r\n .replace(/\\/+/g, '/')\r\n .replace(/^\\//, '');\r\n}\r\n","import { inject, Injectable, computed } from '@angular/core';\r\nimport { Store, select } from '@ngxs/store';\r\nimport { PermissionsState } from './permissions.state';\r\nimport * as PermissionsActions from './permissions.actions';\r\nimport { Observable } from 'rxjs';\r\nimport { PermissionsActionKey } from './permissions.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class PermissionsFacade {\r\n private store = inject(Store);\r\n\r\n // ============================================================================\r\n // Data Selectors - Memoized by NGXS (fine-grained reactivity)\r\n // ============================================================================\r\n readonly roles = select(PermissionsState.getRoles);\r\n readonly selectedRoleValue = select(PermissionsState.getSelectedRoleValue);\r\n readonly selectedGroupValue = select(PermissionsState.getSelectedGroupValue);\r\n readonly permissions = select(PermissionsState.getPermissions);\r\n readonly groupPermissions = select(PermissionsState.getGroupPermissions);\r\n readonly moduleType = select(PermissionsState.getModuleType);\r\n readonly moduleId = select(PermissionsState.getModuleId);\r\n readonly levelId = select(PermissionsState.getLevelId);\r\n\r\n // ============================================================================\r\n // Loading/Error Slices - Memoized by NGXS\r\n // ============================================================================\r\n private readonly loadingActive = select(PermissionsState.getLoadingActive);\r\n private readonly errors = select(PermissionsState.getErrors);\r\n\r\n // ============================================================================\r\n // Loading Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly isLoadingRoles = computed(() =>\r\n this.loadingActive().includes(PermissionsActionKey.LoadRoles),\r\n );\r\n readonly isLoadingPermissions = computed(() =>\r\n this.loadingActive().includes(PermissionsActionKey.LoadPermissions),\r\n );\r\n readonly isLoadingGroupPermissions = computed(() =>\r\n this.loadingActive().includes(PermissionsActionKey.LoadGroupPermissions),\r\n );\r\n readonly isUpdatingPermission = computed(() =>\r\n this.loadingActive().includes(PermissionsActionKey.UpdatePermission),\r\n );\r\n readonly isUpdatingGroupPermission = computed(() =>\r\n this.loadingActive().includes(PermissionsActionKey.UpdateGroupPermission),\r\n );\r\n readonly isTogglingLevelPermissions = computed(() =>\r\n this.loadingActive().includes(\r\n PermissionsActionKey.ToggleAllLevelPermissions,\r\n ),\r\n );\r\n readonly isTogglingGroupPermissions = computed(() =>\r\n this.loadingActive().includes(\r\n PermissionsActionKey.ToggleAllGroupPermissions,\r\n ),\r\n );\r\n\r\n // ============================================================================\r\n // Error Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly rolesError = computed(\r\n () => this.errors()[PermissionsActionKey.LoadRoles] ?? null,\r\n );\r\n readonly permissionsError = computed(\r\n () => this.errors()[PermissionsActionKey.LoadPermissions] ?? null,\r\n );\r\n readonly groupPermissionsError = computed(\r\n () => this.errors()[PermissionsActionKey.LoadGroupPermissions] ?? null,\r\n );\r\n readonly updatePermissionError = computed(\r\n () => this.errors()[PermissionsActionKey.UpdatePermission] ?? null,\r\n );\r\n readonly updateGroupPermissionError = computed(\r\n () => this.errors()[PermissionsActionKey.UpdateGroupPermission] ?? null,\r\n );\r\n\r\n // ============================================================================\r\n // Action Dispatchers\r\n // ============================================================================\r\n\r\n loadRoles() {\r\n return this.store.dispatch(new PermissionsActions.LoadRoles());\r\n }\r\n\r\n selectRole(roleValue: string) {\r\n return this.store.dispatch(new PermissionsActions.SelectRole(roleValue));\r\n }\r\n\r\n selectGroup(groupId: number) {\r\n if (groupId) {\r\n return this.store.dispatch(new PermissionsActions.SelectGroup(groupId));\r\n }\r\n return;\r\n }\r\n\r\n loadPermissions(roleValue: string, levelId: string) {\r\n return this.store.dispatch(\r\n new PermissionsActions.LoadPermissions(roleValue, levelId),\r\n );\r\n }\r\n\r\n loadGroupPermissions(groupId: number, levelId: string) {\r\n return this.store.dispatch(\r\n new PermissionsActions.LoadGroupPermissions(groupId, levelId),\r\n );\r\n }\r\n\r\n updatePermissionLocally(\r\n roleValue: string,\r\n levelId: string,\r\n actionId: number,\r\n isSelected: boolean,\r\n ) {\r\n return this.store.dispatch(\r\n new PermissionsActions.UpdatePermissionLocally(\r\n roleValue,\r\n levelId,\r\n actionId,\r\n isSelected,\r\n ),\r\n );\r\n }\r\n\r\n updatePermission(roleValue: string, levelId: string) {\r\n return this.store.dispatch(\r\n new PermissionsActions.UpdatePermission(roleValue, levelId),\r\n );\r\n }\r\n updateGroupPermission(groupId: string, levelId: string) {\r\n return this.store.dispatch(\r\n new PermissionsActions.UpdateGroupPermission(groupId, levelId),\r\n );\r\n }\r\n\r\n toggleAllLevelPermissions(\r\n roleValue: string,\r\n levelId: string,\r\n levelName: string,\r\n enabled: boolean,\r\n ) {\r\n return this.store.dispatch(\r\n new PermissionsActions.ToggleAllLevelPermissions(\r\n roleValue,\r\n levelId,\r\n levelName,\r\n enabled,\r\n ),\r\n );\r\n }\r\n toggleAllGroupPermissions(\r\n levelId: string,\r\n groupId: string,\r\n enabled: boolean,\r\n ) {\r\n return this.store.dispatch(\r\n new PermissionsActions.ToggleAllGroupPermissions(\r\n levelId,\r\n groupId,\r\n enabled,\r\n ),\r\n );\r\n }\r\n setModuleInfo(\r\n moduleType: string,\r\n moduleId: string | number,\r\n parentModuleType?: string,\r\n parentModuleId?: string | number,\r\n parentPath?: string,\r\n ): Observable<unknown> {\r\n return this.store.dispatch(\r\n new PermissionsActions.SetModuleInfo(\r\n moduleType,\r\n moduleId,\r\n parentModuleType,\r\n parentModuleId,\r\n parentPath,\r\n ),\r\n );\r\n }\r\n\r\n reset() {\r\n return this.store.dispatch(new PermissionsActions.Reset());\r\n }\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\nimport { PermissionsFacade } from '../../../store/permissions/permissions.facade';\r\nimport {\r\n PermissionLog,\r\n PermissionAction,\r\n} from '../../../store/permissions/permissions.model';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { Button } from '@masterteam/components/button';\r\n\r\n@Component({\r\n selector: 'mt-permissions-edit-dialog',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n ToggleField,\r\n TranslocoModule,\r\n FormsModule,\r\n Button,\r\n ],\r\n templateUrl: './permissions-edit-dialog.html',\r\n styleUrl: './permissions-edit-dialog.scss',\r\n})\r\nexport class PermissionsEditDialog {\r\n private permissionsFacade = inject(PermissionsFacade);\r\n modal = inject(ModalService, { optional: true });\r\n ref = inject(ModalRef, { optional: true });\r\n permissionGroup = input<PermissionLog | null>(null);\r\n inline = input(false);\r\n\r\n // Use new facade pattern\r\n addPermissionsLoading = this.permissionsFacade.isUpdatingPermission;\r\n addPermissionsError = this.permissionsFacade.updatePermissionError;\r\n\r\n levelId = input.required<string>();\r\n roleValue = input.required<string>();\r\n isGroup = input.required<boolean>();\r\n\r\n closeDialog = output<void>();\r\n\r\n actionControls = signal<Map<number, FormControl>>(new Map());\r\n toggleAll = signal<boolean>(false);\r\n contentClass = computed(() =>\r\n this.inline()\r\n ? 'flex flex-col gap-3'\r\n : `flex flex-col gap-3 p-4 ${this.modal?.contentClass ?? ''}`,\r\n );\r\n footerClass = computed(() =>\r\n this.inline() ? 'mt-4 flex justify-end' : (this.modal?.footerClass ?? ''),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n const group = this.permissionGroup();\r\n if (group) {\r\n const controls = new Map<number, FormControl>();\r\n group.actions.forEach((action) => {\r\n const control = new FormControl(action.isSelected);\r\n control.valueChanges.subscribe((value) => {\r\n if (value !== null) {\r\n this.onPermissionToggle(action.id, value);\r\n }\r\n });\r\n controls.set(action.id, control);\r\n });\r\n this.actionControls.set(controls);\r\n this.toggleAll.set(group.actions.every((action) => action.isSelected));\r\n }\r\n });\r\n }\r\n\r\n onPermissionToggle(actionId: number, isSelected: boolean) {\r\n const levelId = this.levelId();\r\n const roleValue = this.roleValue();\r\n if (levelId && roleValue) {\r\n this.permissionsFacade.updatePermissionLocally(\r\n roleValue,\r\n levelId,\r\n actionId,\r\n isSelected,\r\n );\r\n }\r\n }\r\n\r\n onClose() {\r\n this.ref?.close();\r\n }\r\n\r\n trackByActionId(_index: number, action: PermissionAction) {\r\n return action.id;\r\n }\r\n\r\n getControl(actionId: number): FormControl {\r\n return this.actionControls().get(actionId) || new FormControl(false);\r\n }\r\n\r\n onSave(): void {\r\n const levelId = this.levelId();\r\n const roleValue = this.roleValue();\r\n const isGroup = this.isGroup();\r\n if (levelId && roleValue) {\r\n let subscription;\r\n if (isGroup) {\r\n subscription = this.permissionsFacade.updateGroupPermission(\r\n roleValue,\r\n levelId,\r\n );\r\n } else {\r\n subscription = this.permissionsFacade.updatePermission(\r\n roleValue,\r\n levelId,\r\n );\r\n }\r\n subscription.subscribe({\r\n next: () => {\r\n if (!this.inline()) {\r\n this.onClose();\r\n }\r\n },\r\n error: (error: any) => {\r\n console.error('Failed to save accessibility permissions:', error);\r\n },\r\n });\r\n }\r\n }\r\n\r\n selectAll() {\r\n const group = this.permissionGroup();\r\n const actions = group?.actions || [];\r\n for (let i = 0; i < actions?.length; i++) {\r\n const control = this.actionControls().get(actions[i].id);\r\n control?.setValue(this.toggleAll());\r\n }\r\n }\r\n}\r\n","<div [class]=\"contentClass()\">\r\n @if (permissionGroup(); as group) {\r\n <div\r\n class=\"mb-4 flex flex-col gap-3 rounded-lg border border-surface p-3 sm:flex-row sm:items-center sm:justify-between\"\r\n >\r\n <span class=\"text-sm font-medium\">{{\r\n \"permissions.selectAll\" | transloco\r\n }}</span>\r\n <mt-toggle-field\r\n class=\"self-end shrink-0 sm:self-center\"\r\n [(ngModel)]=\"toggleAll\"\r\n (onChange)=\"selectAll()\"\r\n ></mt-toggle-field>\r\n </div>\r\n @for (action of group.actions; track trackByActionId($index, action)) {\r\n <div\r\n class=\"flex flex-col gap-3 rounded-lg border border-surface p-3 sm:flex-row sm:items-center sm:justify-between\"\r\n >\r\n <span class=\"min-w-0 break-words text-sm font-medium\">{{\r\n action.name?.display\r\n }}</span>\r\n <mt-toggle-field\r\n class=\"self-end shrink-0 sm:self-center\"\r\n [formControl]=\"getControl(action.id)\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n }\r\n</div>\r\n<div [class]=\"footerClass()\">\r\n <mt-button\r\n class=\"w-full sm:w-auto\"\r\n [label]=\"'save' | transloco\"\r\n (click)=\"onSave()\"\r\n [loading]=\"addPermissionsLoading()\"\r\n />\r\n</div>\r\n","import {\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n linkedSignal,\r\n OnDestroy,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { TranslocoModule, TranslocoService } from '@jsverse/transloco';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { PermissionsFacade } from '../../store/permissions/permissions.facade';\r\nimport { PermissionLog } from '../../store/permissions/permissions.model';\r\nimport { PermissionsEditDialog } from './permissions-edit-dialog/permissions-edit-dialog';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { AccessibilitiesFacade } from '@masterteam/accessibilities';\r\n\r\n@Component({\r\n selector: 'mt-permissions-page',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n Card,\r\n Button,\r\n ToggleField,\r\n TranslocoModule,\r\n Avatar,\r\n SkeletonModule,\r\n Tabs,\r\n PermissionsEditDialog,\r\n ],\r\n templateUrl: './permissions-page.html',\r\n styleUrl: './permissions-page.scss',\r\n})\r\nexport default class PermissionsPage implements OnInit, OnDestroy {\r\n private readonly permissionsFacade = inject(PermissionsFacade);\r\n private readonly accessibilitiesFacade: any = inject(AccessibilitiesFacade);\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly router = inject(Router);\r\n private readonly translocoService = inject(TranslocoService);\r\n private readonly modal = inject(ModalService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n private readonly defaultLevelName = 'Project';\r\n\r\n // Use new facade pattern\r\n levelRoles = this.permissionsFacade.roles;\r\n selectedRoleValue = this.permissionsFacade.selectedRoleValue;\r\n selectedRole = computed(() => this.selectedRoleValue() ?? '');\r\n selectedGroupValue = this.permissionsFacade.selectedGroupValue;\r\n selectedGroup = computed(() => this.selectedGroupValue());\r\n permissions = this.permissionsFacade.permissions;\r\n loading = this.permissionsFacade.isLoadingRoles;\r\n permissionsLoading = this.permissionsFacade.isLoadingPermissions;\r\n levelId = this.permissionsFacade.levelId;\r\n groups = this.accessibilitiesFacade.groups;\r\n\r\n allPermissionsToggle = new FormControl<boolean>(false);\r\n\r\n readonly groupOrRoleId = computed(() => {\r\n const idParam = this.route.snapshot.firstChild?.paramMap.get('id');\r\n return idParam ? idParam : '';\r\n });\r\n\r\n readonly selectedTabFromParams = computed(() => {\r\n const idParam = this.route.snapshot.firstChild?.data['selectedTab'];\r\n return idParam ? idParam : 'roles';\r\n });\r\n readonly permissionTargetValue = computed(() =>\r\n this.selectedTab() === 'roles'\r\n ? (this.selectedRoleValue() ?? '')\r\n : (this.selectedGroup()?.toString() ?? ''),\r\n );\r\n readonly singlePermissionGroup = computed<PermissionLog | null>(() => {\r\n const permissionGroups = this.permissions();\r\n return permissionGroups.length === 1 ? permissionGroups[0] : null;\r\n });\r\n\r\n selectedTab = linkedSignal<string>(this.selectedTabFromParams);\r\n tabsList = signal<any[]>([\r\n {\r\n label: this.translocoService.translate('permissions.roles'),\r\n value: 'roles',\r\n },\r\n {\r\n label: this.translocoService.translate('permissions.groups'),\r\n value: 'groups',\r\n },\r\n ]);\r\n firstLoad = signal(true);\r\n\r\n constructor() {\r\n effect(() => {\r\n const allEnabled = this.isAllPermissionsEnabled();\r\n this.allPermissionsToggle.setValue(allEnabled, { emitEvent: false });\r\n });\r\n effect(() => {\r\n if (this.selectedTab() == 'roles') {\r\n if (this.levelRoles().length == 0) {\r\n if (this.firstLoad() && !this.loading()) {\r\n this.permissionsFacade.loadRoles();\r\n this.firstLoad.set(false);\r\n }\r\n return;\r\n }\r\n }\r\n });\r\n\r\n effect(() => {\r\n if (this.selectedTab() !== 'roles' || this.loading()) {\r\n return;\r\n }\r\n\r\n const roles = this.getRoles();\r\n if (!roles.length) {\r\n return;\r\n }\r\n\r\n const routeRoleValue = this.groupOrRoleId()?.toString();\r\n const selectedRoleValue = this.selectedRoleValue();\r\n const routeRole = routeRoleValue\r\n ? roles.find((role) => role?.value === routeRoleValue)\r\n : null;\r\n\r\n if (routeRole) {\r\n if (selectedRoleValue !== routeRole.value) {\r\n this.permissionsFacade.selectRole(routeRole.value);\r\n }\r\n return;\r\n }\r\n\r\n if (\r\n selectedRoleValue &&\r\n roles.some((role) => role?.value === selectedRoleValue)\r\n ) {\r\n return;\r\n }\r\n\r\n this.selectFirstRole(true);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.permissionsFacade.selectRole('');\r\n this.permissionsFacade.loadRoles();\r\n this.accessibilitiesFacade.getGroups();\r\n\r\n this.allPermissionsToggle.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((value) => {\r\n if (value !== null) {\r\n this.onToggleAllLevel(this.defaultLevelName, value);\r\n }\r\n });\r\n }\r\n\r\n selectRole(roleValue: string): void {\r\n this.router.navigate(['roles', roleValue], { relativeTo: this.route });\r\n this.permissionsFacade.selectRole(roleValue);\r\n }\r\n\r\n private getRoles() {\r\n return this.levelRoles()\r\n .map((levelRoles) => levelRoles.roles ?? [])\r\n .flat();\r\n }\r\n\r\n private selectFirstRole(replaceUrl = false): void {\r\n const firstRoleValue = this.getRoles()[0]?.value;\r\n\r\n if (!firstRoleValue) {\r\n return;\r\n }\r\n\r\n this.router.navigate(['roles', firstRoleValue], {\r\n relativeTo: this.route,\r\n replaceUrl,\r\n });\r\n this.permissionsFacade.selectRole(firstRoleValue);\r\n }\r\n\r\n selectGroup(groupId: number): void {\r\n this.router.navigate(['groups', groupId], { relativeTo: this.route });\r\n this.permissionsFacade.selectGroup(groupId);\r\n }\r\n\r\n openPermissionDialog(group: PermissionLog): void {\r\n if (this.levelId() && (this.selectedRoleValue() || this.selectedGroup())) {\r\n this.modal.openModal(PermissionsEditDialog, 'drawer', {\r\n header: this.translocoService.translate('permissions.setPermissions'),\r\n position: 'end',\r\n styleClass:\r\n '!absolute !shadow-none !w-full !max-w-full sm:!w-[30rem] xl:!w-[24%]',\r\n appendTo: 'page-content',\r\n inputValues: {\r\n permissionGroup: group,\r\n levelId: this.levelId(),\r\n roleValue:\r\n this.selectedTab() == 'roles'\r\n ? this.selectedRoleValue()\r\n : this.selectedGroup(),\r\n isGroup: this.selectedTab() != 'roles',\r\n },\r\n dismissible: true,\r\n });\r\n }\r\n }\r\n\r\n onToggleAllLevel(levelName: string, enabled: boolean): void {\r\n const levelId = this.levelId();\r\n const roleValue = this.selectedRoleValue();\r\n\r\n if (levelId) {\r\n if (this.selectedTab() != 'roles') {\r\n this.permissionsFacade.toggleAllGroupPermissions(\r\n levelId,\r\n this.selectedGroup()!.toString(),\r\n enabled,\r\n );\r\n return;\r\n } else {\r\n if (!!roleValue) {\r\n this.permissionsFacade.toggleAllLevelPermissions(\r\n roleValue,\r\n levelId,\r\n levelName,\r\n enabled,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n isAllPermissionsEnabled(): boolean {\r\n if (this.permissions().length === 0) return false;\r\n\r\n return this.permissions().every((log) =>\r\n log?.actions.every((action) => action?.isSelected),\r\n );\r\n }\r\n\r\n trackByRoleValue(_index: number, role: any) {\r\n return role.value;\r\n }\r\n\r\n onTabChange($event: any) {\r\n if ($event == 'roles') {\r\n if (this.levelRoles().length) {\r\n this.selectFirstRole();\r\n } else {\r\n this.router.navigate(['roles'], { relativeTo: this.route });\r\n }\r\n } else if ($event == 'groups') {\r\n // Navigate to first group if available\r\n const firstGroup = this.groups()[0];\r\n\r\n if (firstGroup?.id) {\r\n this.router.navigate(['groups', firstGroup.id], {\r\n relativeTo: this.route,\r\n });\r\n this.permissionsFacade.selectGroup(firstGroup.id);\r\n } else {\r\n this.router.navigate(['groups'], { relativeTo: this.route });\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.permissionsFacade.reset();\r\n }\r\n}\r\n","<div\r\n id=\"permissions-page-card\"\r\n class=\"grid h-full min-h-0 w-full grid-cols-[minmax(18rem,22rem)_minmax(0,1fr)] gap-4 p-1 max-[1025px]:h-auto max-[1025px]:grid-cols-1 max-[1025px]:gap-3\"\r\n>\r\n <div class=\"min-h-0 min-w-0\">\r\n <mt-card class=\"h-full max-[1025px]:h-auto\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full min-h-0 flex-col\">\r\n <div\r\n class=\"p-4 pb-0 bg-surface-50 rounded-t-2xl border-b border-surface\"\r\n >\r\n <h2 class=\"text-lg font-semibold mb-3\">\r\n {{ \"permissions.rolesAndGroups\" | transloco }}\r\n </h2>\r\n\r\n <div class=\"overflow-x-auto pb-4\">\r\n <mt-tabs\r\n class=\"min-w-max\"\r\n [(active)]=\"selectedTab\"\r\n [options]=\"tabsList()\"\r\n size=\"large\"\r\n (onChange)=\"onTabChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-1 overflow-y-auto p-4 max-[1025px]:max-h-[42vh]\">\r\n @if (loading()) {\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n } @else {\r\n @if (selectedTab() === \"roles\") {\r\n @for (level of levelRoles(); track level) {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n <h2 class=\"font-semibold\">{{ level?.level?.display }}</h2>\r\n @for (role of level.roles; track role.value) {\r\n <div\r\n class=\"flex items-start gap-3 rounded-lg border-2 border-dashed border-gray-300 p-3 transition-colors cursor-pointer\"\r\n [class.bg-primary-50]=\"selectedRole() === role.value\"\r\n [class.hover:bg-surface]=\"selectedRole() !== role.value\"\r\n [class.border-primary-400]=\"\r\n selectedRole() === role.value\r\n \"\r\n [style.--p-avatar-background]=\"\r\n selectedRole() === role.value\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedRole() === role.value ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectRole(role.value)\"\r\n >\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'user.user-check-01'\"\r\n shape=\"square\"\r\n >\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ role.name?.display }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noRolesFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noLevelRolesFound\" | transloco }}\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"flex flex-col gap-2 mb-4\">\r\n @for (group of groups(); track group.name) {\r\n <div\r\n class=\"flex items-start gap-3 rounded-lg border-2 border-dashed border-gray-300 p-3 transition-colors cursor-pointer\"\r\n [class.bg-primary-50]=\"selectedGroup() === group.id\"\r\n [class.hover:bg-surface]=\"selectedGroup() !== group.id\"\r\n [class.border-primary-400]=\"selectedGroup() === group.id\"\r\n [style.--p-avatar-background]=\"\r\n selectedGroup() === group.id\r\n ? 'var(--p-primary-color)'\r\n : 'var(--p-surface-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n selectedGroup() === group.id ? '#ffffff' : ''\r\n \"\r\n (click)=\"selectGroup(group.id)\"\r\n >\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'user.users-check'\"\r\n shape=\"square\"\r\n >\r\n </mt-avatar>\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"font-medium truncate\">\r\n {{ group.name?.display }}\r\n </div>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noGroupsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n\r\n <div class=\"min-h-0 min-w-0\">\r\n @if (!selectedRole() && !selectedGroup()) {\r\n <mt-card class=\"h-full max-[1025px]:h-auto\">\r\n <ng-template #headless>\r\n <div\r\n class=\"flex h-full min-h-[16rem] items-center justify-center p-6 text-center text-muted-color\"\r\n >\r\n {{ \"permissions.selectRoleOrGroupToViewPermissions\" | transloco }}\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n } @else {\r\n <mt-card class=\"h-full max-[1025px]:h-auto\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full min-h-0 flex-col\">\r\n <div class=\"mb-5 border-b border-surface p-4 pb-2\">\r\n <h2 class=\"mb-3 text-lg font-semibold\">\r\n {{ \"permissions.permissions\" | transloco }}\r\n </h2>\r\n </div>\r\n @if (permissionsLoading()) {\r\n <div class=\"mx-4\">\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n <p-skeleton class=\"my-4\" height=\"4rem\" />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"mx-4 mb-5 flex flex-col gap-3 rounded-lg border-1 border-surface p-3 sm:flex-row sm:items-center sm:justify-between\"\r\n >\r\n <div class=\"flex min-w-0 items-start gap-3\">\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'security.lock-unlocked-01'\"\r\n shape=\"square\"\r\n size=\"large\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"'var(--p-' + 'primary' + '-600)'\"\r\n >\r\n </mt-avatar>\r\n <div class=\"min-w-0\">\r\n <div class=\"text-sm font-semibold\">\r\n {{ \"permissions.setAllPermissions\" | transloco }}\r\n </div>\r\n <div class=\"text-xs text-muted-color break-words\">\r\n {{ \"permissions.recommendedForSimpleForms\" | transloco }}\r\n </div>\r\n </div>\r\n </div>\r\n <mt-toggle-field\r\n class=\"self-end shrink-0 sm:self-center\"\r\n [formControl]=\"allPermissionsToggle\"\r\n ></mt-toggle-field>\r\n </div>\r\n\r\n <div\r\n class=\"min-h-0 flex-1 overflow-y-auto border-t border-surface px-4\"\r\n >\r\n @if (singlePermissionGroup(); as group) {\r\n <div\r\n class=\"my-5 rounded-lg border border-surface bg-surface-50 p-4\"\r\n >\r\n <div class=\"mb-4 flex items-start gap-3\">\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'editor.dotpoints-02'\"\r\n shape=\"square\"\r\n size=\"normal\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n 'var(--p-' + 'primary' + '-600)'\r\n \"\r\n >\r\n </mt-avatar>\r\n <span class=\"min-w-0 break-words text-sm font-medium\">\r\n {{ group.name?.display }}\r\n </span>\r\n </div>\r\n\r\n <mt-permissions-edit-dialog\r\n [inline]=\"true\"\r\n [permissionGroup]=\"group\"\r\n [levelId]=\"levelId()\"\r\n [roleValue]=\"permissionTargetValue()\"\r\n [isGroup]=\"selectedTab() !== 'roles'\"\r\n />\r\n </div>\r\n } @else {\r\n <div class=\"space-y-3 my-5\">\r\n @for (group of permissions(); track group.name) {\r\n <div\r\n class=\"flex flex-col gap-3 rounded-lg border-1 border-surface p-3 transition-colors hover:bg-surface-100 sm:flex-row sm:items-center sm:justify-between\"\r\n >\r\n <div class=\"flex min-w-0 items-start gap-3\">\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"'editor.dotpoints-02'\"\r\n shape=\"square\"\r\n size=\"normal\"\r\n [style.--p-avatar-background]=\"\r\n 'var(--p-' + 'surface' + '-100)'\r\n \"\r\n [style.--p-avatar-color]=\"\r\n 'var(--p-' + 'primary' + '-600)'\r\n \"\r\n >\r\n </mt-avatar>\r\n <span class=\"min-w-0 break-words text-sm\">\r\n {{ group.name?.display }}\r\n </span>\r\n </div>\r\n <mt-button\r\n class=\"self-end sm:self-auto\"\r\n [text]=\"true\"\r\n icon=\"custom.pencil\"\r\n severity=\"primary\"\r\n (click)=\"openPermissionDialog(group)\"\r\n >\r\n </mt-button>\r\n </div>\r\n } @empty {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n {{ \"permissions.noPermissionsFound\" | transloco }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n }\r\n </div>\r\n</div>\r\n","// store/index.ts\r\nexport * from './permissions';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["PermissionsActions.LoadPermissions","PermissionsActions.LoadGroupPermissions","PermissionsActions.LoadRoles","PermissionsActions.SelectRole","PermissionsActions.SelectGroup","PermissionsActions.UpdatePermissionLocally","PermissionsActions.UpdatePermission","PermissionsActions.UpdateGroupPermission","PermissionsActions.ToggleAllLevelPermissions","PermissionsActions.ToggleAllGroupPermissions","PermissionsActions.SetModuleInfo","PermissionsActions.Reset","i2","i3"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masterteam/permissions",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "publishConfig": {
5
5
  "directory": "../../../dist/masterteam/permissions",
6
6
  "linkDirectory": false,
@@ -20,8 +20,8 @@
20
20
  "tailwindcss": "^4.1.17",
21
21
  "tailwindcss-primeui": "^0.6.1",
22
22
  "@ngxs/store": "^20.1.0",
23
- "@masterteam/accessibilities": "^0.0.4",
24
- "@masterteam/components": "^0.0.103"
23
+ "@masterteam/components": "^0.0.124",
24
+ "@masterteam/accessibilities": "^0.0.7"
25
25
  },
26
26
  "sideEffects": false,
27
27
  "exports": {
@@ -101,6 +101,7 @@ interface PermissionsStateModel extends LoadingStateShape<PermissionsActionKey>
101
101
  parentPath?: string;
102
102
  }
103
103
  declare enum ModuleType {
104
+ MODULE = "module",
104
105
  LEVEL = "level",
105
106
  LOG = "log",
106
107
  LEVELLOG = "levelLog"
@@ -117,9 +118,9 @@ declare class PermissionsPage implements OnInit, OnDestroy {
117
118
  private readonly defaultLevelName;
118
119
  levelRoles: _angular_core.Signal<_masterteam_permissions.LevelRoles[]>;
119
120
  selectedRoleValue: _angular_core.Signal<string | null>;
120
- selectedRole: _angular_core.WritableSignal<string | null>;
121
+ selectedRole: _angular_core.Signal<string>;
121
122
  selectedGroupValue: _angular_core.Signal<string | number | null>;
122
- selectedGroup: _angular_core.WritableSignal<string | number | null>;
123
+ selectedGroup: _angular_core.Signal<string | number | null>;
123
124
  permissions: _angular_core.Signal<PermissionLog[]>;
124
125
  loading: _angular_core.Signal<boolean>;
125
126
  permissionsLoading: _angular_core.Signal<boolean>;
@@ -128,6 +129,8 @@ declare class PermissionsPage implements OnInit, OnDestroy {
128
129
  allPermissionsToggle: FormControl<boolean | null>;
129
130
  readonly groupOrRoleId: _angular_core.Signal<string>;
130
131
  readonly selectedTabFromParams: _angular_core.Signal<any>;
132
+ readonly permissionTargetValue: _angular_core.Signal<string>;
133
+ readonly singlePermissionGroup: _angular_core.Signal<PermissionLog | null>;
131
134
  selectedTab: _angular_core.WritableSignal<string>;
132
135
  tabsList: _angular_core.WritableSignal<any[]>;
133
136
  firstLoad: _angular_core.WritableSignal<boolean>;
@@ -149,9 +152,10 @@ declare class PermissionsPage implements OnInit, OnDestroy {
149
152
 
150
153
  declare class PermissionsEditDialog {
151
154
  private permissionsFacade;
152
- modal: ModalService;
153
- ref: ModalRef;
155
+ modal: ModalService | null;
156
+ ref: ModalRef<any> | null;
154
157
  permissionGroup: _angular_core.InputSignal<PermissionLog | null>;
158
+ inline: _angular_core.InputSignal<boolean>;
155
159
  addPermissionsLoading: _angular_core.Signal<boolean>;
156
160
  addPermissionsError: _angular_core.Signal<string | null>;
157
161
  levelId: _angular_core.InputSignal<string>;
@@ -160,6 +164,8 @@ declare class PermissionsEditDialog {
160
164
  closeDialog: _angular_core.OutputEmitterRef<void>;
161
165
  actionControls: _angular_core.WritableSignal<Map<number, FormControl<any>>>;
162
166
  toggleAll: _angular_core.WritableSignal<boolean>;
167
+ contentClass: _angular_core.Signal<string>;
168
+ footerClass: _angular_core.Signal<string>;
163
169
  constructor();
164
170
  onPermissionToggle(actionId: number, isSelected: boolean): void;
165
171
  onClose(): void;
@@ -168,7 +174,7 @@ declare class PermissionsEditDialog {
168
174
  onSave(): void;
169
175
  selectAll(): void;
170
176
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PermissionsEditDialog, never>;
171
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PermissionsEditDialog, "mt-permissions-edit-dialog", never, { "permissionGroup": { "alias": "permissionGroup"; "required": false; "isSignal": true; }; "levelId": { "alias": "levelId"; "required": true; "isSignal": true; }; "roleValue": { "alias": "roleValue"; "required": true; "isSignal": true; }; "isGroup": { "alias": "isGroup"; "required": true; "isSignal": true; }; }, { "closeDialog": "closeDialog"; }, never, never, true, never>;
177
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PermissionsEditDialog, "mt-permissions-edit-dialog", never, { "permissionGroup": { "alias": "permissionGroup"; "required": false; "isSignal": true; }; "inline": { "alias": "inline"; "required": false; "isSignal": true; }; "levelId": { "alias": "levelId"; "required": true; "isSignal": true; }; "roleValue": { "alias": "roleValue"; "required": true; "isSignal": true; }; "isGroup": { "alias": "isGroup"; "required": true; "isSignal": true; }; }, { "closeDialog": "closeDialog"; }, never, never, true, never>;
172
178
  }
173
179
 
174
180
  declare class LoadRoles {
@@ -271,7 +277,7 @@ declare class PermissionsFacade {
271
277
  readonly updatePermissionError: _angular_core.Signal<string | null>;
272
278
  readonly updateGroupPermissionError: _angular_core.Signal<string | null>;
273
279
  loadRoles(): Observable<void>;
274
- selectRole(roleValue: string): Observable<void> | undefined;
280
+ selectRole(roleValue: string): Observable<void>;
275
281
  selectGroup(groupId: number): Observable<void> | undefined;
276
282
  loadPermissions(roleValue: string, levelId: string): Observable<void>;
277
283
  loadGroupPermissions(groupId: number, levelId: string): Observable<void>;