@masterteam/customization 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/assets/customization.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
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-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--font-weight-semibold:600;--radius-lg:.5rem;--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}.sticky{position:sticky}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.z-10{z-index:10}.col-span-4{grid-column:span 4/span 4}.col-span-6{grid-column:span 6/span 6}.col-span-12{grid-column:span 12/span 12}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-full{height:100%}.\!w-\[27\%\]{width:27%!important}.w-1\/5{width:20%}.w-3\/5{width:60%}.w-150{width:calc(var(--spacing) * 150)}.w-full{width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}: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)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-10{row-gap:calc(var(--spacing) * 10)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden\!{overflow-y:hidden!important}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-gray-300{border-color:var(--color-gray-300)}.bg-surface-0{background-color:var(--p-surface-0)}@supports (color:color-mix(in lab, red, red)){.bg-surface-0{background-color:color-mix(in srgb, var(--p-surface-0) 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)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-10{padding-bottom:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--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)}.text-primary{color:var(--p-primary-color)}@supports (color:color-mix(in lab, red, red)){.text-primary{color:color-mix(in srgb, var(--p-primary-color) calc(100% * 1), transparent)}}.\!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-emphasis:hover{background:var(--p-content-hover-background);color:var(--p-content-hover-color)}}}@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}
|
|
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-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--font-weight-semibold:600;--radius-lg:.5rem;--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}.sticky{position:sticky}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.z-10{z-index:10}.col-span-8{grid-column:span 8/span 8}.col-span-20{grid-column:span 20/span 20}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-full{height:100%}.\!w-\[27\%\]{width:27%!important}.w-1\/5{width:20%}.w-3\/5{width:60%}.w-150{width:calc(var(--spacing) * 150)}.w-full{width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grid-cols-24{grid-template-columns:repeat(24,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}: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)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-7{row-gap:calc(var(--spacing) * 7)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden\!{overflow-y:hidden!important}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-gray-300{border-color:var(--color-gray-300)}.bg-surface-0{background-color:var(--p-surface-0)}@supports (color:color-mix(in lab, red, red)){.bg-surface-0{background-color:color-mix(in srgb, var(--p-surface-0) 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)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-10{padding-bottom:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--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)}.text-primary{color:var(--p-primary-color)}@supports (color:color-mix(in lab, red, red)){.text-primary{color:color-mix(in srgb, var(--p-primary-color) calc(100% * 1), transparent)}}.\!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-emphasis:hover{background:var(--p-content-hover-background);color:var(--p-content-hover-color)}}}@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}
|
|
@@ -20,6 +20,7 @@ import { ModalRef } from '@masterteam/components/dialog';
|
|
|
20
20
|
/** ViewTypes that support the 'showBorder' toggle */
|
|
21
21
|
const BORDER_VIEW_TYPES = [
|
|
22
22
|
'Text',
|
|
23
|
+
'LongText',
|
|
23
24
|
'Currency',
|
|
24
25
|
'Date',
|
|
25
26
|
'DateTime',
|
|
@@ -471,7 +472,7 @@ class Customization {
|
|
|
471
472
|
return props.map((p) => ({ ...p, enabled: false }));
|
|
472
473
|
return props.map((p) => ({
|
|
473
474
|
...p,
|
|
474
|
-
enabled: configs.some((c) => c.areaKey === area && c.propertyKey === p.
|
|
475
|
+
enabled: configs.some((c) => c.areaKey === area && c.propertyKey === p.key),
|
|
475
476
|
}));
|
|
476
477
|
}, ...(ngDevMode ? [{ debugName: "propertiesWithEnabled" }] : []));
|
|
477
478
|
filteredProperties = computed(() => {
|
|
@@ -521,11 +522,17 @@ class Customization {
|
|
|
521
522
|
}
|
|
522
523
|
onPropertyToggle(prop, enabled) {
|
|
523
524
|
if (enabled) {
|
|
524
|
-
|
|
525
|
+
// If the viewType has configurable fields, open the drawer; otherwise save directly
|
|
526
|
+
if (this.editableViewTypes.has(prop.viewType)) {
|
|
527
|
+
this.openDrawer(prop);
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
this.saveDirectly(prop);
|
|
531
|
+
}
|
|
525
532
|
}
|
|
526
533
|
else {
|
|
527
534
|
// Remove this property and bulk-replace with remaining checked props
|
|
528
|
-
this.bulkSaveWithout(prop.
|
|
535
|
+
this.bulkSaveWithout(prop.key);
|
|
529
536
|
}
|
|
530
537
|
}
|
|
531
538
|
onEditProperty(prop) {
|
|
@@ -533,7 +540,7 @@ class Customization {
|
|
|
533
540
|
if (!area)
|
|
534
541
|
return;
|
|
535
542
|
const configs = this.facade.configurations();
|
|
536
|
-
const existingConfig = configs.find((c) => c.areaKey === area && c.propertyKey === prop.
|
|
543
|
+
const existingConfig = configs.find((c) => c.areaKey === area && c.propertyKey === prop.key);
|
|
537
544
|
this.openDrawer(prop, existingConfig);
|
|
538
545
|
}
|
|
539
546
|
onEntityResized(event) {
|
|
@@ -542,7 +549,7 @@ class Customization {
|
|
|
542
549
|
return;
|
|
543
550
|
const configs = this.facade.configurations();
|
|
544
551
|
// Update the configuration for the resized entity in the current area
|
|
545
|
-
const updatedConfigs = configs.map((c) => c.areaKey === area && c.propertyKey === event.entity.
|
|
552
|
+
const updatedConfigs = configs.map((c) => c.areaKey === area && c.propertyKey === event.entity.key
|
|
546
553
|
? { ...c, configuration: { ...c.configuration, size: event.newSize } }
|
|
547
554
|
: c);
|
|
548
555
|
// Build bulk-replace items from updated configs
|
|
@@ -555,9 +562,9 @@ class Customization {
|
|
|
555
562
|
return;
|
|
556
563
|
const configs = this.facade.configurations();
|
|
557
564
|
const items = entities.map((entity, index) => {
|
|
558
|
-
const existingConfig = configs.find((c) => c.areaKey === area && c.propertyKey === entity.
|
|
565
|
+
const existingConfig = configs.find((c) => c.areaKey === area && c.propertyKey === entity.key);
|
|
559
566
|
return {
|
|
560
|
-
propertyKey: entity.
|
|
567
|
+
propertyKey: entity.key,
|
|
561
568
|
displayAreas: [
|
|
562
569
|
{
|
|
563
570
|
areaKey: area,
|
|
@@ -575,6 +582,41 @@ class Customization {
|
|
|
575
582
|
this.facade.bulkReplaceConfigurations(mergedItems).subscribe();
|
|
576
583
|
}
|
|
577
584
|
// ── Private helpers ──
|
|
585
|
+
/**
|
|
586
|
+
* Save a property directly without opening the drawer (for viewTypes with no configurable fields).
|
|
587
|
+
*/
|
|
588
|
+
saveDirectly(prop) {
|
|
589
|
+
const area = this.activeArea();
|
|
590
|
+
if (!area)
|
|
591
|
+
return;
|
|
592
|
+
const configs = this.facade.configurations();
|
|
593
|
+
const areaConfigs = configs.filter((c) => c.areaKey === area);
|
|
594
|
+
const nextOrder = areaConfigs.length + 1;
|
|
595
|
+
const newDisplayArea = {
|
|
596
|
+
areaKey: area,
|
|
597
|
+
order: nextOrder,
|
|
598
|
+
configuration: {},
|
|
599
|
+
};
|
|
600
|
+
// Build bulk items from existing configs + new property
|
|
601
|
+
const itemsMap = new Map();
|
|
602
|
+
for (const c of configs) {
|
|
603
|
+
if (!itemsMap.has(c.propertyKey)) {
|
|
604
|
+
itemsMap.set(c.propertyKey, []);
|
|
605
|
+
}
|
|
606
|
+
itemsMap.get(c.propertyKey).push({
|
|
607
|
+
areaKey: c.areaKey,
|
|
608
|
+
order: c.order,
|
|
609
|
+
configuration: c.configuration,
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
// Add the new property
|
|
613
|
+
if (!itemsMap.has(prop.key)) {
|
|
614
|
+
itemsMap.set(prop.key, []);
|
|
615
|
+
}
|
|
616
|
+
itemsMap.get(prop.key).push(newDisplayArea);
|
|
617
|
+
const items = Array.from(itemsMap.entries()).map(([propertyKey, displayAreas]) => ({ propertyKey, displayAreas }));
|
|
618
|
+
this.facade.bulkReplaceConfigurations(items).subscribe();
|
|
619
|
+
}
|
|
578
620
|
/**
|
|
579
621
|
* Build bulk items from all current configurations, excluding a specific property.
|
|
580
622
|
* Then call bulk-replace so the backend replaces the entire context atomically.
|
|
@@ -651,7 +693,7 @@ class Customization {
|
|
|
651
693
|
appendTo: '#page-content',
|
|
652
694
|
dismissible: true,
|
|
653
695
|
inputValues: {
|
|
654
|
-
propertyKey: prop.
|
|
696
|
+
propertyKey: prop.key,
|
|
655
697
|
propertyName: displayName,
|
|
656
698
|
viewType: prop.viewType,
|
|
657
699
|
areaKey: area,
|
|
@@ -661,7 +703,7 @@ class Customization {
|
|
|
661
703
|
});
|
|
662
704
|
}
|
|
663
705
|
buildEntityFromConfig(config, props) {
|
|
664
|
-
const prop = props.find((p) => p.
|
|
706
|
+
const prop = props.find((p) => p.key === config.propertyKey);
|
|
665
707
|
if (!prop)
|
|
666
708
|
return null;
|
|
667
709
|
const displayName = this.getPropertyDisplayName(prop);
|
|
@@ -678,13 +720,6 @@ class Customization {
|
|
|
678
720
|
order: config.order,
|
|
679
721
|
configuration: config.configuration,
|
|
680
722
|
};
|
|
681
|
-
// Add user-specific fields for User viewType
|
|
682
|
-
if (viewType === 'User') {
|
|
683
|
-
entity.displayName = 'John Doe';
|
|
684
|
-
entity.photoUrl = '';
|
|
685
|
-
entity.phoneNumber = '+1234567890';
|
|
686
|
-
entity.email = 'user@example.com';
|
|
687
|
-
}
|
|
688
723
|
return entity;
|
|
689
724
|
}
|
|
690
725
|
getPropertyDisplayName(prop) {
|
|
@@ -701,6 +736,8 @@ class Customization {
|
|
|
701
736
|
switch (viewType) {
|
|
702
737
|
case 'Text':
|
|
703
738
|
return 'Sample Text';
|
|
739
|
+
case 'LongText':
|
|
740
|
+
return '<p>Sample long text content</p>';
|
|
704
741
|
case 'Date':
|
|
705
742
|
return '2026-01-15';
|
|
706
743
|
case 'DateTime':
|
|
@@ -709,12 +746,24 @@ class Customization {
|
|
|
709
746
|
return '75%';
|
|
710
747
|
case 'Status':
|
|
711
748
|
return { key: 'sample', display: name, color: '#3B82F6' };
|
|
749
|
+
case 'Lookup':
|
|
750
|
+
return {
|
|
751
|
+
key: 'sample',
|
|
752
|
+
display: name,
|
|
753
|
+
color: '#8B5CF6',
|
|
754
|
+
description: '',
|
|
755
|
+
};
|
|
712
756
|
case 'Currency':
|
|
713
757
|
return '$1,250.00';
|
|
714
758
|
case 'Checkbox':
|
|
715
759
|
return 'true';
|
|
716
760
|
case 'User':
|
|
717
|
-
return
|
|
761
|
+
return {
|
|
762
|
+
displayName: 'Tesst User',
|
|
763
|
+
photoUrl: '',
|
|
764
|
+
phoneNumber: '+1234567890',
|
|
765
|
+
email: 'user@example.com',
|
|
766
|
+
};
|
|
718
767
|
default:
|
|
719
768
|
return name;
|
|
720
769
|
}
|
|
@@ -730,7 +779,7 @@ class Customization {
|
|
|
730
779
|
}
|
|
731
780
|
}
|
|
732
781
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: Customization, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
733
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: Customization, isStandalone: true, selector: "mt-customization", ngImport: i0, template: "<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div class=\"flex gap-6 h-full w-full overflow-hidden\">\r\n <!-- \u2500\u2500\u2500 Left Sidebar: Attributes Panel \u2500\u2500\u2500 -->\r\n <mt-card class=\"w-1/5 h-full flex flex-col overflow-hidden pb-3\">\r\n <ng-template #headless>\r\n <!-- Header -->\r\n <h3 class=\"text-xl font-semibold px-4 pt-5 pb-3\">\r\n {{ t(\"attributes\") }}\r\n </h3>\r\n\r\n <!-- Properties List -->\r\n <div class=\"flex-1 overflow-y-auto px-4 pb-4 space-y-3\">\r\n <!-- Search Field -->\r\n <div class=\"sticky top-0 bg-surface-0 mb-0 py-3 pb-2 mb-1 z-10\">\r\n <mt-text-field\r\n [placeholder]=\"t('search-properties')\"\r\n [(ngModel)]=\"searchQuery\"\r\n icon=\"general.search-lg\"\r\n />\r\n </div>\r\n @if (isLoading()) {\r\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\r\n <div class=\"flex items-center gap-1 p-1 rounded-lg\">\r\n <p-skeleton height=\"4rem\" />\r\n </div>\r\n }\r\n } @else {\r\n @for (prop of filteredProperties(); track prop.id) {\r\n <div\r\n class=\"flex items-center gap-3 p-3 rounded-lg border border-gray-300 border-dashed hover:bg-emphasis transition-colors\"\r\n >\r\n <!-- Property Name -->\r\n <div class=\"flex-1 min-w-0 py-2\">\r\n <span\r\n class=\"text-sm font-medium truncate block\"\r\n [class.text-primary]=\"prop.enabled\"\r\n >\r\n {{ prop.name?.display }}\r\n </span>\r\n </div>\r\n\r\n <!-- Edit Button (visible when enabled and viewType has configurable fields) -->\r\n @if (prop.enabled && editableViewTypes.has(prop.viewType)) {\r\n <mt-button\r\n icon=\"editor.pencil-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n (onClick)=\"onEditProperty(prop)\"\r\n />\r\n }\r\n\r\n <!-- Toggle -->\r\n <mt-toggle-field\r\n [ngModel]=\"prop.enabled\"\r\n (ngModelChange)=\"onPropertyToggle(prop, $event)\"\r\n class=\"shrink-0\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n\r\n @if (filteredProperties().length === 0) {\r\n <div class=\"py-8 text-center text-muted-color\">\r\n <p class=\"text-sm\">{{ t(\"no-properties\") }}</p>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n\r\n <!-- \u2500\u2500\u2500 Main Area: Preview \u2500\u2500\u2500 -->\r\n <div class=\"w-3/5 flex flex-col gap-4 h-full overflow-hidden items-center\">\r\n <!-- Area Tabs -->\r\n @if (isLoadingAreas()) {\r\n <div class=\"flex gap-2 py-1\">\r\n @for (i of [1, 2, 3]; track i) {\r\n <p-skeleton width=\"6rem\" height=\"2.25rem\" borderRadius=\"8px\" />\r\n }\r\n </div>\r\n } @else if (areasTabs().length > 0) {\r\n <mt-tabs\r\n [options]=\"areasTabs()\"\r\n [(active)]=\"activeArea\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n }\r\n\r\n <!-- Entities Preview -->\r\n <
|
|
782
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: Customization, isStandalone: true, selector: "mt-customization", ngImport: i0, template: "<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div class=\"flex gap-6 h-full w-full overflow-hidden\">\r\n <!-- \u2500\u2500\u2500 Left Sidebar: Attributes Panel \u2500\u2500\u2500 -->\r\n <mt-card class=\"w-1/5 h-full flex flex-col overflow-hidden pb-3\">\r\n <ng-template #headless>\r\n <!-- Header -->\r\n <h3 class=\"text-xl font-semibold px-4 pt-5 pb-3\">\r\n {{ t(\"attributes\") }}\r\n </h3>\r\n\r\n <!-- Properties List -->\r\n <div class=\"flex-1 overflow-y-auto px-4 pb-4 space-y-3\">\r\n <!-- Search Field -->\r\n <div class=\"sticky top-0 bg-surface-0 mb-0 py-3 pb-2 mb-1 z-10\">\r\n <mt-text-field\r\n [placeholder]=\"t('search-properties')\"\r\n [(ngModel)]=\"searchQuery\"\r\n icon=\"general.search-lg\"\r\n />\r\n </div>\r\n @if (isLoading()) {\r\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\r\n <div class=\"flex items-center gap-1 p-1 rounded-lg\">\r\n <p-skeleton height=\"4rem\" />\r\n </div>\r\n }\r\n } @else {\r\n @for (prop of filteredProperties(); track prop.id) {\r\n <div\r\n class=\"flex items-center gap-3 p-3 rounded-lg border border-gray-300 border-dashed hover:bg-emphasis transition-colors\"\r\n >\r\n <!-- Property Name -->\r\n <div class=\"flex-1 min-w-0 py-2\">\r\n <span\r\n class=\"text-sm font-medium truncate block\"\r\n [class.text-primary]=\"prop.enabled\"\r\n >\r\n {{ prop.name?.display }}\r\n </span>\r\n </div>\r\n\r\n <!-- Edit Button (visible when enabled and viewType has configurable fields) -->\r\n @if (prop.enabled && editableViewTypes.has(prop.viewType)) {\r\n <mt-button\r\n icon=\"editor.pencil-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n (onClick)=\"onEditProperty(prop)\"\r\n />\r\n }\r\n\r\n <!-- Toggle -->\r\n <mt-toggle-field\r\n [ngModel]=\"prop.enabled\"\r\n (ngModelChange)=\"onPropertyToggle(prop, $event)\"\r\n class=\"shrink-0\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n\r\n @if (filteredProperties().length === 0) {\r\n <div class=\"py-8 text-center text-muted-color\">\r\n <p class=\"text-sm\">{{ t(\"no-properties\") }}</p>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n\r\n <!-- \u2500\u2500\u2500 Main Area: Preview \u2500\u2500\u2500 -->\r\n <div class=\"w-3/5 flex flex-col gap-4 h-full overflow-hidden items-center\">\r\n <!-- Area Tabs -->\r\n @if (isLoadingAreas()) {\r\n <div class=\"flex gap-2 py-1\">\r\n @for (i of [1, 2, 3]; track i) {\r\n <p-skeleton width=\"6rem\" height=\"2.25rem\" borderRadius=\"8px\" />\r\n }\r\n </div>\r\n } @else if (areasTabs().length > 0) {\r\n <mt-tabs\r\n [options]=\"areasTabs()\"\r\n [(active)]=\"activeArea\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n }\r\n\r\n <!-- Entities Preview -->\r\n <mt-card class=\"w-150 flex-1 overflow-hidden\">\r\n <div>\r\n <ng-template #headless>\r\n <div class=\"overflow-auto h-full my-2 p-2\">\r\n @if (isLoadingPreview()) {\r\n <div class=\"grid grid-cols-24 gap-x-4 gap-y-7 p-4\">\r\n <div class=\"col-span-20 flex items-center gap-2.5 p-3\">\r\n <p-skeleton size=\"4rem\" shape=\"circle\" />\r\n <div class=\"flex flex-col gap-1 flex-1\">\r\n <p-skeleton height=\"2.5rem\" borderRadius=\"4px\" />\r\n </div>\r\n </div>\r\n @for (i of [1, 2, 3, 4]; track i) {\r\n <div class=\"col-span-8 flex flex-col gap-1.5 p-3\">\r\n <p-skeleton height=\"4rem\" borderRadius=\"6px\" />\r\n </div>\r\n }\r\n </div>\r\n } @else if (previewEntities().length > 0) {\r\n <mt-entities-manage\r\n [(entities)]=\"previewEntities\"\r\n (entitiesReordered)=\"onEntitiesReordered($event)\"\r\n (entityResized)=\"onEntityResized($event)\"\r\n />\r\n } @else {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n <p class=\"text-sm\">{{ t(\"no-preview-items\") }}</p>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </div>\r\n </mt-card>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:block;height:100%;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: TextField, selector: "mt-text-field", inputs: ["field", "hint", "label", "placeholder", "class", "type", "readonly", "pInputs", "required", "icon", "iconPosition"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { 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: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: EntitiesManage, selector: "mt-entities-manage", inputs: ["entities"], outputs: ["entitiesChange", "entitiesReordered"] }] });
|
|
734
783
|
}
|
|
735
784
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: Customization, decorators: [{
|
|
736
785
|
type: Component,
|
|
@@ -745,7 +794,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
|
|
|
745
794
|
Icon,
|
|
746
795
|
Skeleton,
|
|
747
796
|
EntitiesManage,
|
|
748
|
-
], template: "<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div class=\"flex gap-6 h-full w-full overflow-hidden\">\r\n <!-- \u2500\u2500\u2500 Left Sidebar: Attributes Panel \u2500\u2500\u2500 -->\r\n <mt-card class=\"w-1/5 h-full flex flex-col overflow-hidden pb-3\">\r\n <ng-template #headless>\r\n <!-- Header -->\r\n <h3 class=\"text-xl font-semibold px-4 pt-5 pb-3\">\r\n {{ t(\"attributes\") }}\r\n </h3>\r\n\r\n <!-- Properties List -->\r\n <div class=\"flex-1 overflow-y-auto px-4 pb-4 space-y-3\">\r\n <!-- Search Field -->\r\n <div class=\"sticky top-0 bg-surface-0 mb-0 py-3 pb-2 mb-1 z-10\">\r\n <mt-text-field\r\n [placeholder]=\"t('search-properties')\"\r\n [(ngModel)]=\"searchQuery\"\r\n icon=\"general.search-lg\"\r\n />\r\n </div>\r\n @if (isLoading()) {\r\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\r\n <div class=\"flex items-center gap-1 p-1 rounded-lg\">\r\n <p-skeleton height=\"4rem\" />\r\n </div>\r\n }\r\n } @else {\r\n @for (prop of filteredProperties(); track prop.id) {\r\n <div\r\n class=\"flex items-center gap-3 p-3 rounded-lg border border-gray-300 border-dashed hover:bg-emphasis transition-colors\"\r\n >\r\n <!-- Property Name -->\r\n <div class=\"flex-1 min-w-0 py-2\">\r\n <span\r\n class=\"text-sm font-medium truncate block\"\r\n [class.text-primary]=\"prop.enabled\"\r\n >\r\n {{ prop.name?.display }}\r\n </span>\r\n </div>\r\n\r\n <!-- Edit Button (visible when enabled and viewType has configurable fields) -->\r\n @if (prop.enabled && editableViewTypes.has(prop.viewType)) {\r\n <mt-button\r\n icon=\"editor.pencil-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n (onClick)=\"onEditProperty(prop)\"\r\n />\r\n }\r\n\r\n <!-- Toggle -->\r\n <mt-toggle-field\r\n [ngModel]=\"prop.enabled\"\r\n (ngModelChange)=\"onPropertyToggle(prop, $event)\"\r\n class=\"shrink-0\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n\r\n @if (filteredProperties().length === 0) {\r\n <div class=\"py-8 text-center text-muted-color\">\r\n <p class=\"text-sm\">{{ t(\"no-properties\") }}</p>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n\r\n <!-- \u2500\u2500\u2500 Main Area: Preview \u2500\u2500\u2500 -->\r\n <div class=\"w-3/5 flex flex-col gap-4 h-full overflow-hidden items-center\">\r\n <!-- Area Tabs -->\r\n @if (isLoadingAreas()) {\r\n <div class=\"flex gap-2 py-1\">\r\n @for (i of [1, 2, 3]; track i) {\r\n <p-skeleton width=\"6rem\" height=\"2.25rem\" borderRadius=\"8px\" />\r\n }\r\n </div>\r\n } @else if (areasTabs().length > 0) {\r\n <mt-tabs\r\n [options]=\"areasTabs()\"\r\n [(active)]=\"activeArea\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n }\r\n\r\n <!-- Entities Preview -->\r\n <
|
|
797
|
+
], template: "<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div class=\"flex gap-6 h-full w-full overflow-hidden\">\r\n <!-- \u2500\u2500\u2500 Left Sidebar: Attributes Panel \u2500\u2500\u2500 -->\r\n <mt-card class=\"w-1/5 h-full flex flex-col overflow-hidden pb-3\">\r\n <ng-template #headless>\r\n <!-- Header -->\r\n <h3 class=\"text-xl font-semibold px-4 pt-5 pb-3\">\r\n {{ t(\"attributes\") }}\r\n </h3>\r\n\r\n <!-- Properties List -->\r\n <div class=\"flex-1 overflow-y-auto px-4 pb-4 space-y-3\">\r\n <!-- Search Field -->\r\n <div class=\"sticky top-0 bg-surface-0 mb-0 py-3 pb-2 mb-1 z-10\">\r\n <mt-text-field\r\n [placeholder]=\"t('search-properties')\"\r\n [(ngModel)]=\"searchQuery\"\r\n icon=\"general.search-lg\"\r\n />\r\n </div>\r\n @if (isLoading()) {\r\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\r\n <div class=\"flex items-center gap-1 p-1 rounded-lg\">\r\n <p-skeleton height=\"4rem\" />\r\n </div>\r\n }\r\n } @else {\r\n @for (prop of filteredProperties(); track prop.id) {\r\n <div\r\n class=\"flex items-center gap-3 p-3 rounded-lg border border-gray-300 border-dashed hover:bg-emphasis transition-colors\"\r\n >\r\n <!-- Property Name -->\r\n <div class=\"flex-1 min-w-0 py-2\">\r\n <span\r\n class=\"text-sm font-medium truncate block\"\r\n [class.text-primary]=\"prop.enabled\"\r\n >\r\n {{ prop.name?.display }}\r\n </span>\r\n </div>\r\n\r\n <!-- Edit Button (visible when enabled and viewType has configurable fields) -->\r\n @if (prop.enabled && editableViewTypes.has(prop.viewType)) {\r\n <mt-button\r\n icon=\"editor.pencil-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n (onClick)=\"onEditProperty(prop)\"\r\n />\r\n }\r\n\r\n <!-- Toggle -->\r\n <mt-toggle-field\r\n [ngModel]=\"prop.enabled\"\r\n (ngModelChange)=\"onPropertyToggle(prop, $event)\"\r\n class=\"shrink-0\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n\r\n @if (filteredProperties().length === 0) {\r\n <div class=\"py-8 text-center text-muted-color\">\r\n <p class=\"text-sm\">{{ t(\"no-properties\") }}</p>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n\r\n <!-- \u2500\u2500\u2500 Main Area: Preview \u2500\u2500\u2500 -->\r\n <div class=\"w-3/5 flex flex-col gap-4 h-full overflow-hidden items-center\">\r\n <!-- Area Tabs -->\r\n @if (isLoadingAreas()) {\r\n <div class=\"flex gap-2 py-1\">\r\n @for (i of [1, 2, 3]; track i) {\r\n <p-skeleton width=\"6rem\" height=\"2.25rem\" borderRadius=\"8px\" />\r\n }\r\n </div>\r\n } @else if (areasTabs().length > 0) {\r\n <mt-tabs\r\n [options]=\"areasTabs()\"\r\n [(active)]=\"activeArea\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n }\r\n\r\n <!-- Entities Preview -->\r\n <mt-card class=\"w-150 flex-1 overflow-hidden\">\r\n <div>\r\n <ng-template #headless>\r\n <div class=\"overflow-auto h-full my-2 p-2\">\r\n @if (isLoadingPreview()) {\r\n <div class=\"grid grid-cols-24 gap-x-4 gap-y-7 p-4\">\r\n <div class=\"col-span-20 flex items-center gap-2.5 p-3\">\r\n <p-skeleton size=\"4rem\" shape=\"circle\" />\r\n <div class=\"flex flex-col gap-1 flex-1\">\r\n <p-skeleton height=\"2.5rem\" borderRadius=\"4px\" />\r\n </div>\r\n </div>\r\n @for (i of [1, 2, 3, 4]; track i) {\r\n <div class=\"col-span-8 flex flex-col gap-1.5 p-3\">\r\n <p-skeleton height=\"4rem\" borderRadius=\"6px\" />\r\n </div>\r\n }\r\n </div>\r\n } @else if (previewEntities().length > 0) {\r\n <mt-entities-manage\r\n [(entities)]=\"previewEntities\"\r\n (entitiesReordered)=\"onEntitiesReordered($event)\"\r\n (entityResized)=\"onEntityResized($event)\"\r\n />\r\n } @else {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n <p class=\"text-sm\">{{ t(\"no-preview-items\") }}</p>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </div>\r\n </mt-card>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:block;height:100%;width:100%}\n"] }]
|
|
749
798
|
}], ctorParameters: () => [] });
|
|
750
799
|
|
|
751
800
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-customization.mjs","sources":["../../../../packages/masterteam/customization/src/lib/customization.model.ts","../../../../packages/masterteam/customization/src/store/customization/customization.actions.ts","../../../../packages/masterteam/customization/src/store/customization/customization.model.ts","../../../../packages/masterteam/customization/src/store/customization/customization.state.ts","../../../../packages/masterteam/customization/src/store/customization/customization.facade.ts","../../../../packages/masterteam/customization/src/lib/property-config-drawer/property-config-drawer.ts","../../../../packages/masterteam/customization/src/lib/property-config-drawer/property-config-drawer.html","../../../../packages/masterteam/customization/src/lib/customization.ts","../../../../packages/masterteam/customization/src/lib/customization.html","../../../../packages/masterteam/customization/src/masterteam-customization.ts"],"sourcesContent":["// Re-export entity types from the canonical source\r\nexport type {\r\n EntityViewType,\r\n EntitySize,\r\n EntityData,\r\n EntityStatusValue,\r\n EntityResizeEvent,\r\n} from '@masterteam/components/entities';\r\n\r\nimport type { EntityViewType } from '@masterteam/components/entities';\r\n\r\n// ── Preview-specific models ──\r\n\r\n/**\r\n * Configuration for a property that can be edited via the drawer.\r\n * Note: `size` is managed via mouse-drag resize, not the edit drawer.\r\n */\r\nexport interface PropertyEditConfig {\r\n showBorder: boolean;\r\n /** User viewType only */\r\n showDisplayName: boolean;\r\n showPhoneNumber: boolean;\r\n showEmail: boolean;\r\n}\r\n\r\n/** ViewTypes that support the 'showBorder' toggle */\r\nexport const BORDER_VIEW_TYPES: EntityViewType[] = [\r\n 'Text',\r\n 'Currency',\r\n 'Date',\r\n 'DateTime',\r\n];\r\n\r\n/** ViewTypes that support user-specific toggles */\r\nexport const USER_VIEW_TYPES: EntityViewType[] = ['User'];\r\n\r\n/**\r\n * ViewTypes that have editable configuration fields in the drawer.\r\n * If a viewType is NOT in this list, the edit button is hidden\r\n * (since size is now managed via drag-resize only).\r\n */\r\nexport const EDITABLE_VIEW_TYPES: EntityViewType[] = [\r\n ...BORDER_VIEW_TYPES,\r\n ...USER_VIEW_TYPES,\r\n];\r\n","import type { BulkReplaceItem } from './api.model';\r\n\r\nexport class GetCustomization {\r\n static readonly type = '[Customization] Get Properties';\r\n\r\n constructor(public readonly params?: Record<string, unknown>) {}\r\n}\r\n\r\nexport class GetManagePreviewAreas {\r\n static readonly type = '[Customization] Get Areas';\r\n}\r\n\r\nexport class GetManagePreviewConfigurations {\r\n static readonly type = '[Customization] Get Configurations';\r\n\r\n constructor(public readonly areaKeys?: string[]) {}\r\n}\r\n\r\nexport class SetManagePreviewModuleInfo {\r\n static readonly type = '[Customization] 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 BulkReplaceConfigurations {\r\n static readonly type = '[Customization] Bulk Replace Configurations';\r\n\r\n constructor(public readonly items: BulkReplaceItem[]) {}\r\n}\r\n","import type { LoadingStateShape } from '@masterteam/components';\r\nimport type { DisplayArea, DisplayConfiguration } from './api.model';\r\n\r\nexport interface ManagePreviewPropertyItem {\r\n id: number;\r\n key: string;\r\n normalizedKey: string;\r\n viewType: string;\r\n viewTypeLabel: string;\r\n name: string | Record<string, string>;\r\n description?: Record<string, string>;\r\n defaultValue?: unknown;\r\n order?: number;\r\n enabled?: boolean;\r\n isSystem?: boolean;\r\n isBasic?: boolean;\r\n isCalculated?: boolean;\r\n isConfigurable?: boolean;\r\n isRequired?: boolean;\r\n isTranslatable?: boolean;\r\n shownInTable?: boolean;\r\n includeInSummary?: boolean;\r\n category?: string;\r\n configuration?: Record<string, unknown>;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport enum CustomizationActionKey {\r\n GetProperties = 'getProperties',\r\n GetAreas = 'getAreas',\r\n GetConfigurations = 'getConfigurations',\r\n BulkReplaceConfigurations = 'bulkReplaceConfigurations',\r\n}\r\n\r\nexport interface CustomizationStateModel extends LoadingStateShape<CustomizationActionKey> {\r\n properties: ManagePreviewPropertyItem[];\r\n areas: DisplayArea[];\r\n configurations: DisplayConfiguration[];\r\n moduleType: string | null;\r\n moduleId: string | number | null;\r\n parentModuleType: string | null;\r\n parentModuleId: string | number | null;\r\n parentPath: string;\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport { CrudStateBase, handleApiRequest } from '@masterteam/components';\r\nimport {\r\n CustomizationActionKey,\r\n CustomizationStateModel,\r\n ManagePreviewPropertyItem,\r\n} from './customization.model';\r\nimport {\r\n GetCustomization,\r\n GetManagePreviewAreas,\r\n GetManagePreviewConfigurations,\r\n SetManagePreviewModuleInfo,\r\n BulkReplaceConfigurations,\r\n} from './customization.actions';\r\nimport { DisplayArea, DisplayConfiguration, Response } from './api.model';\r\n\r\nconst DEFAULT_STATE: CustomizationStateModel = {\r\n properties: [],\r\n areas: [],\r\n configurations: [],\r\n loadingActive: [],\r\n errors: {},\r\n moduleType: null,\r\n moduleId: null,\r\n parentModuleType: null,\r\n parentModuleId: null,\r\n parentPath: '',\r\n};\r\n\r\n@State<CustomizationStateModel>({\r\n name: 'customization',\r\n defaults: DEFAULT_STATE,\r\n})\r\n@Injectable()\r\nexport class CustomizationState extends CrudStateBase<\r\n ManagePreviewPropertyItem,\r\n CustomizationStateModel,\r\n CustomizationActionKey\r\n> {\r\n private readonly http = inject(HttpClient);\r\n private readonly baseUrl = 'Properties';\r\n private readonly displayConfigUrl = 'display-configurations';\r\n\r\n // ============================================================================\r\n // Data Selectors - Individual for fine-grained reactivity\r\n // ============================================================================\r\n\r\n @Selector()\r\n static getProperties(\r\n state: CustomizationStateModel,\r\n ): ManagePreviewPropertyItem[] {\r\n return state.properties;\r\n }\r\n\r\n @Selector()\r\n static getAreas(state: CustomizationStateModel): DisplayArea[] {\r\n return state.areas;\r\n }\r\n\r\n @Selector()\r\n static getConfigurations(\r\n state: CustomizationStateModel,\r\n ): DisplayConfiguration[] {\r\n return state.configurations;\r\n }\r\n\r\n @Selector()\r\n static getModuleId(state: CustomizationStateModel): string | number | null {\r\n return state.moduleId;\r\n }\r\n\r\n @Selector()\r\n static getModuleType(state: CustomizationStateModel): string | null {\r\n return state.moduleType;\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: CustomizationStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: CustomizationStateModel,\r\n ): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n // ============================================================================\r\n // Actions\r\n // ============================================================================\r\n\r\n @Action(GetManagePreviewAreas)\r\n getAreas(ctx: StateContext<CustomizationStateModel>) {\r\n const req$ = this.http.get<Response<DisplayArea[]>>(\r\n `${this.displayConfigUrl}/areas`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.GetAreas,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n areas: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n @Action(GetCustomization)\r\n getProperties(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: GetCustomization,\r\n ) {\r\n const state = ctx.getState();\r\n const contextKey = this.buildContextKey(state);\r\n\r\n const params = {\r\n ...action.params,\r\n contextKey,\r\n };\r\n\r\n const req$ = this.http.get<Response<ManagePreviewPropertyItem[]>>(\r\n `${this.baseUrl}/catalog`,\r\n { params },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.GetProperties,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n properties: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n @Action(GetManagePreviewConfigurations)\r\n getConfigurations(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: GetManagePreviewConfigurations,\r\n ) {\r\n const state = ctx.getState();\r\n const contextKey = this.buildContextKey(state);\r\n\r\n const params: Record<string, string | string[]> = { contextKey };\r\n if (action.areaKeys?.length) {\r\n params['areaKeys'] = action.areaKeys;\r\n }\r\n\r\n const req$ = this.http.get<Response<DisplayConfiguration[]>>(\r\n this.displayConfigUrl,\r\n { params },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.GetConfigurations,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n configurations: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n @Action(SetManagePreviewModuleInfo)\r\n setModuleInfo(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: SetManagePreviewModuleInfo,\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\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(BulkReplaceConfigurations)\r\n bulkReplaceConfigurations(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: BulkReplaceConfigurations,\r\n ) {\r\n const state = ctx.getState();\r\n const contextKey = this.buildContextKey(state);\r\n\r\n const req$ = this.http.put<Response<boolean>>(\r\n `${this.displayConfigUrl}/bulk-replace`,\r\n {\r\n contextKey,\r\n items: action.items,\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.BulkReplaceConfigurations,\r\n request$: req$,\r\n onSuccess: () => {\r\n // Rebuild configurations from the items payload\r\n const newConfigs: DisplayConfiguration[] = [];\r\n for (const item of action.items) {\r\n for (const da of item.displayAreas) {\r\n newConfigs.push({\r\n contextKey,\r\n areaKey: da.areaKey,\r\n propertyKey: item.propertyKey,\r\n order: da.order,\r\n configuration: da.configuration,\r\n });\r\n }\r\n }\r\n return { configurations: newConfigs };\r\n },\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Private Helpers\r\n // ============================================================================\r\n\r\n private buildContextKey(state: CustomizationStateModel): string {\r\n const contextParts: string[] = [];\r\n if (state.parentModuleType && state.parentModuleId) {\r\n contextParts.push(`${state.parentModuleType}:${state.parentModuleId}`);\r\n }\r\n if (state.moduleType && state.moduleId) {\r\n contextParts.push(`${state.moduleType}:${state.moduleId}`);\r\n }\r\n return contextParts.join('/');\r\n }\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { select, Store } from '@ngxs/store';\r\nimport type { Observable } from 'rxjs';\r\nimport { CustomizationActionKey } from './customization.model';\r\nimport {\r\n GetCustomization,\r\n GetManagePreviewAreas,\r\n GetManagePreviewConfigurations,\r\n SetManagePreviewModuleInfo,\r\n BulkReplaceConfigurations,\r\n} from './customization.actions';\r\nimport { CustomizationState } from './customization.state';\r\nimport type { BulkReplaceItem } from './api.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CustomizationFacade {\r\n private readonly store = inject(Store);\r\n\r\n // ============================================================================\r\n // Data Selectors - Memoized by NGXS (fine-grained reactivity)\r\n // ============================================================================\r\n readonly properties = select(CustomizationState.getProperties);\r\n readonly areas = select(CustomizationState.getAreas);\r\n readonly configurations = select(CustomizationState.getConfigurations);\r\n readonly moduleId = select(CustomizationState.getModuleId);\r\n readonly moduleType = select(CustomizationState.getModuleType);\r\n\r\n // ============================================================================\r\n // Loading/Error Slices - Memoized by NGXS\r\n // ============================================================================\r\n private readonly loadingActive = select(CustomizationState.getLoadingActive);\r\n private readonly errors = select(CustomizationState.getErrors);\r\n\r\n // ============================================================================\r\n // Loading Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly isLoadingProperties = computed(() =>\r\n this.loadingActive().includes(CustomizationActionKey.GetProperties),\r\n );\r\n\r\n readonly isLoadingAreas = computed(() =>\r\n this.loadingActive().includes(CustomizationActionKey.GetAreas),\r\n );\r\n\r\n readonly isLoadingConfigurations = computed(() =>\r\n this.loadingActive().includes(CustomizationActionKey.GetConfigurations),\r\n );\r\n\r\n readonly isBulkReplacing = computed(() =>\r\n this.loadingActive().includes(\r\n CustomizationActionKey.BulkReplaceConfigurations,\r\n ),\r\n );\r\n\r\n // ============================================================================\r\n // Error Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly propertiesError = computed(\r\n () => this.errors()[CustomizationActionKey.GetProperties] ?? null,\r\n );\r\n\r\n readonly areasError = computed(\r\n () => this.errors()[CustomizationActionKey.GetAreas] ?? null,\r\n );\r\n\r\n readonly configurationsError = computed(\r\n () => this.errors()[CustomizationActionKey.GetConfigurations] ?? null,\r\n );\r\n\r\n readonly bulkReplaceError = computed(\r\n () =>\r\n this.errors()[CustomizationActionKey.BulkReplaceConfigurations] ?? null,\r\n );\r\n\r\n // ============================================================================\r\n // Action Dispatchers\r\n // ============================================================================\r\n\r\n loadAreas(): Observable<unknown> {\r\n return this.store.dispatch(new GetManagePreviewAreas());\r\n }\r\n\r\n loadProperties(params?: Record<string, unknown>): Observable<unknown> {\r\n return this.store.dispatch(new GetCustomization(params));\r\n }\r\n\r\n loadConfigurations(areaKeys?: string[]): Observable<unknown> {\r\n return this.store.dispatch(new GetManagePreviewConfigurations(areaKeys));\r\n }\r\n\r\n bulkReplaceConfigurations(items: BulkReplaceItem[]): Observable<unknown> {\r\n return this.store.dispatch(new BulkReplaceConfigurations(items));\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 SetManagePreviewModuleInfo(\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","import {\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport type {\r\n EntityViewType,\r\n PropertyEditConfig,\r\n} from '../customization.model';\r\nimport { BORDER_VIEW_TYPES, USER_VIEW_TYPES } from '../customization.model';\r\nimport { CustomizationFacade } from '../../store';\r\nimport type { BulkReplaceItem } from '../../store/customization';\r\n\r\n@Component({\r\n selector: 'mt-property-config-drawer',\r\n standalone: true,\r\n imports: [TranslocoDirective, ReactiveFormsModule, Button, ToggleField],\r\n templateUrl: './property-config-drawer.html',\r\n})\r\nexport class PropertyConfigDrawer {\r\n protected readonly modalService = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n private readonly facade = inject(CustomizationFacade);\r\n\r\n // ─── Inputs (passed via drawer inputValues) ───\r\n readonly propertyKey = input<string>('');\r\n readonly propertyName = input<string>('');\r\n readonly viewType = input<EntityViewType>('Text');\r\n readonly areaKey = input<string>('card');\r\n readonly currentOrder = input<number>(1);\r\n readonly initialConfig = input<PropertyEditConfig>({\r\n showBorder: false,\r\n showDisplayName: false,\r\n showPhoneNumber: false,\r\n showEmail: false,\r\n });\r\n\r\n // ─── UI state ───\r\n readonly submitting = signal(false);\r\n readonly showBorderControl = new FormControl(false);\r\n readonly showDisplayNameControl = new FormControl(false);\r\n readonly showPhoneNumberControl = new FormControl(false);\r\n readonly showEmailControl = new FormControl(false);\r\n\r\n // ─── Computed visibility flags ───\r\n readonly isBorderViewType = computed(() =>\r\n BORDER_VIEW_TYPES.includes(this.viewType()),\r\n );\r\n readonly isUserViewType = computed(() =>\r\n USER_VIEW_TYPES.includes(this.viewType()),\r\n );\r\n\r\n constructor() {\r\n // Initialize form from input config\r\n effect(() => {\r\n const config = this.initialConfig();\r\n this.showBorderControl.patchValue(config.showBorder ?? false);\r\n this.showDisplayNameControl.patchValue(config.showDisplayName ?? false);\r\n this.showPhoneNumberControl.patchValue(config.showPhoneNumber ?? false);\r\n this.showEmailControl.patchValue(config.showEmail ?? false);\r\n });\r\n }\r\n\r\n onSave(): void {\r\n // Preserve existing size from configuration (managed via drag-resize)\r\n const existingConfig = this.facade\r\n .configurations()\r\n .find(\r\n (c) =>\r\n c.propertyKey === this.propertyKey() && c.areaKey === this.areaKey(),\r\n );\r\n const existingSize = existingConfig?.configuration?.['size'];\r\n\r\n const configuration: Record<string, unknown> = {};\r\n\r\n // Carry over size so drag-resize value is not lost\r\n if (existingSize != null) {\r\n configuration['size'] = existingSize;\r\n }\r\n\r\n if (this.isBorderViewType()) {\r\n configuration['showBorder'] = this.showBorderControl.value ?? false;\r\n }\r\n if (this.isUserViewType()) {\r\n configuration['showDisplayName'] =\r\n this.showDisplayNameControl.value ?? false;\r\n configuration['showPhoneNumber'] =\r\n this.showPhoneNumberControl.value ?? false;\r\n configuration['showEmail'] = this.showEmailControl.value ?? false;\r\n }\r\n\r\n const newDisplayArea = {\r\n areaKey: this.areaKey(),\r\n order: this.currentOrder(),\r\n configuration,\r\n };\r\n\r\n // Build bulk items from existing configs, replacing the current property+area\r\n const configs = this.facade.configurations();\r\n const itemsMap = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const c of configs) {\r\n // Skip the entry being replaced\r\n if (\r\n c.propertyKey === this.propertyKey() &&\r\n c.areaKey === this.areaKey()\r\n ) {\r\n continue;\r\n }\r\n if (!itemsMap.has(c.propertyKey)) {\r\n itemsMap.set(c.propertyKey, []);\r\n }\r\n itemsMap.get(c.propertyKey)!.push({\r\n areaKey: c.areaKey,\r\n order: c.order,\r\n configuration: c.configuration,\r\n });\r\n }\r\n\r\n // Add/replace the current property's area config\r\n if (!itemsMap.has(this.propertyKey())) {\r\n itemsMap.set(this.propertyKey(), []);\r\n }\r\n itemsMap.get(this.propertyKey())!.push(newDisplayArea);\r\n\r\n const items: BulkReplaceItem[] = Array.from(itemsMap.entries()).map(\r\n ([propertyKey, displayAreas]) => ({ propertyKey, displayAreas }),\r\n );\r\n\r\n this.submitting.set(true);\r\n this.facade.bulkReplaceConfigurations(items).subscribe({\r\n next: () => this.ref.close(true),\r\n error: () => this.submitting.set(false),\r\n });\r\n }\r\n\r\n onCancel(): void {\r\n this.ref.close(null);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div [class]=\"[modalService.contentClass, 'p-4', 'overflow-y-hidden!']\">\r\n <div class=\"mt-2 h-full overflow-y-auto pb-10 flex flex-col gap-5\">\r\n <!-- Show Border Toggle (Text, Currency, Date, DateTime) -->\r\n @if (isBorderViewType()) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-border')\"\r\n icon=\"layout.layout-grid-01\"\r\n [formControl]=\"showBorderControl\"\r\n ></mt-toggle-field>\r\n }\r\n\r\n <!-- User-specific Toggles -->\r\n @if (isUserViewType()) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-display-name')\"\r\n icon=\"user.user-circle\"\r\n [formControl]=\"showDisplayNameControl\"\r\n ></mt-toggle-field>\r\n\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-phone-number')\"\r\n icon=\"communication.phone\"\r\n [formControl]=\"showPhoneNumberControl\"\r\n ></mt-toggle-field>\r\n\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-email')\"\r\n icon=\"communication.mail-01\"\r\n [formControl]=\"showEmailControl\"\r\n ></mt-toggle-field>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n severity=\"secondary\"\r\n [disabled]=\"submitting()\"\r\n (onClick)=\"onCancel()\"\r\n ></mt-button>\r\n <mt-button\r\n [label]=\"t('save')\"\r\n severity=\"primary\"\r\n [loading]=\"submitting()\"\r\n (onClick)=\"onSave()\"\r\n ></mt-button>\r\n </div>\r\n</ng-container>\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { EntitiesManage } from '@masterteam/components/entities';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Skeleton } from 'primeng/skeleton';\r\nimport type {\r\n EntityData,\r\n EntityViewType,\r\n EntityStatusValue,\r\n EntityResizeEvent,\r\n PropertyEditConfig,\r\n} from './customization.model';\r\nimport { EDITABLE_VIEW_TYPES } from './customization.model';\r\nimport { CustomizationFacade } from '../store';\r\nimport type {\r\n ManagePreviewPropertyItem,\r\n DisplayConfiguration,\r\n BulkReplaceItem,\r\n} from '../store/customization';\r\nimport { PropertyConfigDrawer } from './property-config-drawer/property-config-drawer';\r\n\r\n@Component({\r\n selector: 'mt-customization',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n TranslocoDirective,\r\n Card,\r\n TextField,\r\n ToggleField,\r\n Button,\r\n Tabs,\r\n Icon,\r\n Skeleton,\r\n EntitiesManage,\r\n ],\r\n templateUrl: './customization.html',\r\n styleUrl: './customization.scss',\r\n})\r\nexport class Customization implements OnInit {\r\n protected readonly facade = inject(CustomizationFacade);\r\n private readonly modalService = inject(ModalService);\r\n\r\n /** Set of viewTypes that have editable fields in the drawer (beyond size) */\r\n protected readonly editableViewTypes = new Set(EDITABLE_VIEW_TYPES);\r\n\r\n readonly searchQuery = signal('');\r\n readonly activeArea = signal<string | null>(null);\r\n\r\n // ── Derived signals ──\r\n readonly properties = this.facade.properties;\r\n readonly areas = this.facade.areas;\r\n readonly isLoading = this.facade.isLoadingProperties;\r\n readonly isLoadingAreas = this.facade.isLoadingAreas;\r\n readonly isLoadingPreview = computed(\r\n () =>\r\n this.facade.isLoadingConfigurations() ||\r\n this.facade.isLoadingProperties(),\r\n );\r\n\r\n readonly areasTabs = computed(() =>\r\n this.areas().map((area) => ({ label: area.name, value: area.key })),\r\n );\r\n\r\n /** Properties enriched with `enabled` based on current area configurations */\r\n readonly propertiesWithEnabled = computed(() => {\r\n const props = this.properties();\r\n const configs = this.facade.configurations();\r\n const area = this.activeArea();\r\n\r\n if (!area) return props.map((p) => ({ ...p, enabled: false }));\r\n\r\n return props.map((p) => ({\r\n ...p,\r\n enabled: configs.some(\r\n (c) => c.areaKey === area && c.propertyKey === p.normalizedKey,\r\n ),\r\n }));\r\n });\r\n\r\n readonly filteredProperties = computed(() => {\r\n const query = this.searchQuery().toLowerCase().trim();\r\n const list = this.propertiesWithEnabled();\r\n\r\n if (!query) return list;\r\n\r\n return list.filter((prop) => {\r\n const name =\r\n typeof prop.name === 'string'\r\n ? prop.name\r\n : Object.values(prop.name).join(' ');\r\n return name.toLowerCase().includes(query);\r\n });\r\n });\r\n\r\n /** Preview entities built from configurations + properties for the active area */\r\n previewEntities = signal<EntityData[]>([]);\r\n\r\n constructor() {\r\n // Set default active area when areas load\r\n effect(() => {\r\n const areas = this.areas();\r\n if (areas.length > 0 && !this.activeArea()) {\r\n this.activeArea.set(areas[0].key);\r\n }\r\n });\r\n\r\n // Rebuild preview entities when configs, properties, or active area change\r\n effect(() => {\r\n const configs = this.facade.configurations();\r\n const props = this.properties();\r\n const area = this.activeArea();\r\n\r\n if (!area || !props.length) {\r\n this.previewEntities.set([]);\r\n return;\r\n }\r\n\r\n const areaConfigs = configs.filter((c) => c.areaKey === area);\r\n const entities = areaConfigs\r\n .map((config) => this.buildEntityFromConfig(config, props))\r\n .filter((e): e is EntityData => e !== null)\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n\r\n this.previewEntities.set(entities);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n // Load display areas\r\n this.facade.loadAreas();\r\n\r\n this.facade.loadProperties();\r\n this.facade.loadConfigurations();\r\n }\r\n\r\n onPropertyToggle(\r\n prop: ManagePreviewPropertyItem & { enabled: boolean },\r\n enabled: boolean,\r\n ): void {\r\n if (enabled) {\r\n this.openDrawer(prop);\r\n } else {\r\n // Remove this property and bulk-replace with remaining checked props\r\n this.bulkSaveWithout(prop.normalizedKey);\r\n }\r\n }\r\n\r\n onEditProperty(prop: ManagePreviewPropertyItem): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const existingConfig = configs.find(\r\n (c) => c.areaKey === area && c.propertyKey === prop.normalizedKey,\r\n );\r\n\r\n this.openDrawer(prop, existingConfig);\r\n }\r\n\r\n onEntityResized(event: EntityResizeEvent): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n\r\n // Update the configuration for the resized entity in the current area\r\n const updatedConfigs = configs.map((c) =>\r\n c.areaKey === area && c.propertyKey === event.entity.normalizedKey\r\n ? { ...c, configuration: { ...c.configuration, size: event.newSize } }\r\n : c,\r\n );\r\n\r\n // Build bulk-replace items from updated configs\r\n const items = this.groupConfigsByProperty(updatedConfigs);\r\n this.facade.bulkReplaceConfigurations(items).subscribe();\r\n }\r\n\r\n onEntitiesReordered(entities: EntityData[]): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const items: BulkReplaceItem[] = entities.map((entity, index) => {\r\n const existingConfig = configs.find(\r\n (c) => c.areaKey === area && c.propertyKey === entity.normalizedKey,\r\n );\r\n return {\r\n propertyKey: entity.normalizedKey!,\r\n displayAreas: [\r\n {\r\n areaKey: area,\r\n order: index + 1,\r\n configuration: existingConfig?.configuration ?? {},\r\n },\r\n ],\r\n };\r\n });\r\n\r\n // Include configs from other areas that are not being reordered\r\n const otherAreaConfigs = configs.filter((c) => c.areaKey !== area);\r\n const otherAreaItems = this.groupConfigsByProperty(otherAreaConfigs);\r\n\r\n // Merge: for properties that exist in both, combine their displayAreas\r\n const mergedItems = this.mergeItems(items, otherAreaItems);\r\n\r\n this.facade.bulkReplaceConfigurations(mergedItems).subscribe();\r\n }\r\n\r\n // ── Private helpers ──\r\n\r\n /**\r\n * Build bulk items from all current configurations, excluding a specific property.\r\n * Then call bulk-replace so the backend replaces the entire context atomically.\r\n */\r\n private bulkSaveWithout(excludePropertyKey: string): void {\r\n const configs = this.facade.configurations();\r\n const remaining = configs.filter(\r\n (c) => c.propertyKey !== excludePropertyKey,\r\n );\r\n const items = this.groupConfigsByProperty(remaining);\r\n this.facade.bulkReplaceConfigurations(items).subscribe();\r\n }\r\n\r\n /**\r\n * Group flat DisplayConfiguration[] into bulk-replace items grouped by propertyKey.\r\n */\r\n private groupConfigsByProperty(\r\n configs: DisplayConfiguration[],\r\n ): BulkReplaceItem[] {\r\n const map = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const c of configs) {\r\n if (!map.has(c.propertyKey)) {\r\n map.set(c.propertyKey, []);\r\n }\r\n map.get(c.propertyKey)!.push({\r\n areaKey: c.areaKey,\r\n order: c.order,\r\n configuration: c.configuration,\r\n });\r\n }\r\n\r\n return Array.from(map.entries()).map(([propertyKey, displayAreas]) => ({\r\n propertyKey,\r\n displayAreas,\r\n }));\r\n }\r\n\r\n /**\r\n * Merge two sets of bulk items. If a propertyKey exists in both,\r\n * combine their displayAreas arrays.\r\n */\r\n private mergeItems(\r\n primary: BulkReplaceItem[],\r\n secondary: BulkReplaceItem[],\r\n ): BulkReplaceItem[] {\r\n const map = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const item of primary) {\r\n map.set(item.propertyKey, [...item.displayAreas]);\r\n }\r\n\r\n for (const item of secondary) {\r\n const existing = map.get(item.propertyKey);\r\n if (existing) {\r\n existing.push(...item.displayAreas);\r\n } else {\r\n map.set(item.propertyKey, [...item.displayAreas]);\r\n }\r\n }\r\n\r\n return Array.from(map.entries()).map(([propertyKey, displayAreas]) => ({\r\n propertyKey,\r\n displayAreas,\r\n }));\r\n }\r\n\r\n private openDrawer(\r\n prop: ManagePreviewPropertyItem,\r\n existingConfig?: DisplayConfiguration,\r\n ): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const areaConfigs = configs.filter((c) => c.areaKey === area);\r\n const nextOrder = existingConfig?.order ?? areaConfigs.length + 1;\r\n\r\n const displayName = this.getPropertyDisplayName(prop);\r\n const cfg = existingConfig?.configuration;\r\n const initConfig: PropertyEditConfig = {\r\n showBorder: (cfg?.['showBorder'] as boolean) ?? false,\r\n showDisplayName: (cfg?.['showDisplayName'] as boolean) ?? false,\r\n showPhoneNumber: (cfg?.['showPhoneNumber'] as boolean) ?? false,\r\n showEmail: (cfg?.['showEmail'] as boolean) ?? false,\r\n };\r\n\r\n this.modalService.openModal(PropertyConfigDrawer, 'drawer', {\r\n header: displayName,\r\n height: '25vw',\r\n styleClass: '!w-[27%] !absolute !shadow-none',\r\n position: 'end',\r\n appendTo: '#page-content',\r\n dismissible: true,\r\n inputValues: {\r\n propertyKey: prop.normalizedKey,\r\n propertyName: displayName,\r\n viewType: prop.viewType,\r\n areaKey: area,\r\n currentOrder: nextOrder,\r\n initialConfig: initConfig,\r\n },\r\n });\r\n }\r\n\r\n private buildEntityFromConfig(\r\n config: DisplayConfiguration,\r\n props: ManagePreviewPropertyItem[],\r\n ): EntityData | null {\r\n const prop = props.find((p) => p.normalizedKey === config.propertyKey);\r\n if (!prop) return null;\r\n\r\n const displayName = this.getPropertyDisplayName(prop);\r\n const viewType = prop.viewType as EntityViewType;\r\n\r\n const entity: EntityData = {\r\n id: prop.id,\r\n propertyId: prop.id,\r\n key: prop.key,\r\n normalizedKey: prop.normalizedKey,\r\n name: displayName,\r\n value: this.getPlaceholderValue(viewType, displayName),\r\n rawValue: this.getPlaceholderRawValue(viewType, displayName),\r\n viewType,\r\n order: config.order,\r\n configuration: config.configuration as EntityData['configuration'],\r\n };\r\n\r\n // Add user-specific fields for User viewType\r\n if (viewType === 'User') {\r\n entity.displayName = 'John Doe';\r\n entity.photoUrl = '';\r\n entity.phoneNumber = '+1234567890';\r\n entity.email = 'user@example.com';\r\n }\r\n\r\n return entity;\r\n }\r\n\r\n private getPropertyDisplayName(prop: ManagePreviewPropertyItem): string {\r\n if (typeof prop.name === 'string') return prop.name;\r\n if (prop.name && typeof prop.name === 'object') {\r\n return (\r\n (prop.name as Record<string, string>)['display'] ||\r\n Object.values(prop.name)[0] ||\r\n prop.key\r\n );\r\n }\r\n return prop.key;\r\n }\r\n\r\n private getPlaceholderValue(\r\n viewType: EntityViewType,\r\n name: string,\r\n ): string | EntityStatusValue {\r\n switch (viewType) {\r\n case 'Text':\r\n return 'Sample Text';\r\n case 'Date':\r\n return '2026-01-15';\r\n case 'DateTime':\r\n return '2026-01-15 10:30';\r\n case 'Percentage':\r\n return '75%';\r\n case 'Status':\r\n return { key: 'sample', display: name, color: '#3B82F6' };\r\n case 'Currency':\r\n return '$1,250.00';\r\n case 'Checkbox':\r\n return 'true';\r\n case 'User':\r\n return 'John Doe';\r\n default:\r\n return name;\r\n }\r\n }\r\n\r\n private getPlaceholderRawValue(\r\n viewType: EntityViewType,\r\n name: string,\r\n ): string {\r\n switch (viewType) {\r\n case 'Percentage':\r\n return '75';\r\n\r\n case 'Checkbox':\r\n return 'true';\r\n default:\r\n return name;\r\n }\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div class=\"flex gap-6 h-full w-full overflow-hidden\">\r\n <!-- ─── Left Sidebar: Attributes Panel ─── -->\r\n <mt-card class=\"w-1/5 h-full flex flex-col overflow-hidden pb-3\">\r\n <ng-template #headless>\r\n <!-- Header -->\r\n <h3 class=\"text-xl font-semibold px-4 pt-5 pb-3\">\r\n {{ t(\"attributes\") }}\r\n </h3>\r\n\r\n <!-- Properties List -->\r\n <div class=\"flex-1 overflow-y-auto px-4 pb-4 space-y-3\">\r\n <!-- Search Field -->\r\n <div class=\"sticky top-0 bg-surface-0 mb-0 py-3 pb-2 mb-1 z-10\">\r\n <mt-text-field\r\n [placeholder]=\"t('search-properties')\"\r\n [(ngModel)]=\"searchQuery\"\r\n icon=\"general.search-lg\"\r\n />\r\n </div>\r\n @if (isLoading()) {\r\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\r\n <div class=\"flex items-center gap-1 p-1 rounded-lg\">\r\n <p-skeleton height=\"4rem\" />\r\n </div>\r\n }\r\n } @else {\r\n @for (prop of filteredProperties(); track prop.id) {\r\n <div\r\n class=\"flex items-center gap-3 p-3 rounded-lg border border-gray-300 border-dashed hover:bg-emphasis transition-colors\"\r\n >\r\n <!-- Property Name -->\r\n <div class=\"flex-1 min-w-0 py-2\">\r\n <span\r\n class=\"text-sm font-medium truncate block\"\r\n [class.text-primary]=\"prop.enabled\"\r\n >\r\n {{ prop.name?.display }}\r\n </span>\r\n </div>\r\n\r\n <!-- Edit Button (visible when enabled and viewType has configurable fields) -->\r\n @if (prop.enabled && editableViewTypes.has(prop.viewType)) {\r\n <mt-button\r\n icon=\"editor.pencil-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n (onClick)=\"onEditProperty(prop)\"\r\n />\r\n }\r\n\r\n <!-- Toggle -->\r\n <mt-toggle-field\r\n [ngModel]=\"prop.enabled\"\r\n (ngModelChange)=\"onPropertyToggle(prop, $event)\"\r\n class=\"shrink-0\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n\r\n @if (filteredProperties().length === 0) {\r\n <div class=\"py-8 text-center text-muted-color\">\r\n <p class=\"text-sm\">{{ t(\"no-properties\") }}</p>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n\r\n <!-- ─── Main Area: Preview ─── -->\r\n <div class=\"w-3/5 flex flex-col gap-4 h-full overflow-hidden items-center\">\r\n <!-- Area Tabs -->\r\n @if (isLoadingAreas()) {\r\n <div class=\"flex gap-2 py-1\">\r\n @for (i of [1, 2, 3]; track i) {\r\n <p-skeleton width=\"6rem\" height=\"2.25rem\" borderRadius=\"8px\" />\r\n }\r\n </div>\r\n } @else if (areasTabs().length > 0) {\r\n <mt-tabs\r\n [options]=\"areasTabs()\"\r\n [(active)]=\"activeArea\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n }\r\n\r\n <!-- Entities Preview -->\r\n <div class=\"h-full\">\r\n <mt-card class=\"h-full p-3 w-150\">\r\n <ng-template #headless>\r\n @if (isLoadingPreview()) {\r\n <div class=\"grid grid-cols-12 gap-x-4 gap-y-10 p-4\">\r\n @for (i of [1, 2, 3]; track i) {\r\n <div class=\"col-span-4 flex flex-col gap-1.5 p-3\">\r\n <p-skeleton width=\"60%\" height=\"2rem\" borderRadius=\"6px\" />\r\n <p-skeleton\r\n width=\"40%\"\r\n height=\"1.5rem\"\r\n borderRadius=\"4px\"\r\n />\r\n </div>\r\n }\r\n <div class=\"col-span-12 flex flex-col gap-1.5 p-3\">\r\n <p-skeleton width=\"20rem\" height=\"4rem\" borderRadius=\"6px\" />\r\n </div>\r\n <div class=\"col-span-6 flex items-center gap-2.5 p-3\">\r\n <p-skeleton size=\"4rem\" shape=\"circle\" />\r\n <div class=\"flex flex-col gap-1 flex-1\">\r\n <p-skeleton\r\n width=\"55%\"\r\n height=\"0.85rem\"\r\n borderRadius=\"4px\"\r\n />\r\n <p-skeleton\r\n width=\"35%\"\r\n height=\"0.65rem\"\r\n borderRadius=\"4px\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n } @else if (previewEntities().length > 0) {\r\n <mt-entities-manage\r\n [(entities)]=\"previewEntities\"\r\n (entitiesReordered)=\"onEntitiesReordered($event)\"\r\n (entityResized)=\"onEntityResized($event)\"\r\n />\r\n } @else {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n <p class=\"text-sm\">{{ t(\"no-preview-items\") }}</p>\r\n </div>\r\n }\r\n </ng-template>\r\n </mt-card>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAyBA;AACO,MAAM,iBAAiB,GAAqB;IACjD,MAAM;IACN,UAAU;IACV,MAAM;IACN,UAAU;CACX;AAED;AACO,MAAM,eAAe,GAAqB,CAAC,MAAM,CAAC;AAEzD;;;;AAIG;AACI,MAAM,mBAAmB,GAAqB;AACnD,IAAA,GAAG,iBAAiB;AACpB,IAAA,GAAG,eAAe;CACnB;;MC1CY,gBAAgB,CAAA;AAGC,IAAA,MAAA;AAF5B,IAAA,OAAgB,IAAI,GAAG,gCAAgC;AAEvD,IAAA,WAAA,CAA4B,MAAgC,EAAA;QAAhC,IAAA,CAAA,MAAM,GAAN,MAAM;IAA6B;;MAGpD,qBAAqB,CAAA;AAChC,IAAA,OAAgB,IAAI,GAAG,2BAA2B;;MAGvC,8BAA8B,CAAA;AAGb,IAAA,QAAA;AAF5B,IAAA,OAAgB,IAAI,GAAG,oCAAoC;AAE3D,IAAA,WAAA,CAA4B,QAAmB,EAAA;QAAnB,IAAA,CAAA,QAAQ,GAAR,QAAQ;IAAc;;MAGvC,0BAA0B,CAAA;AAInB,IAAA,UAAA;AACA,IAAA,QAAA;AACA,IAAA,gBAAA;AACA,IAAA,cAAA;AACA,IAAA,UAAA;AAPlB,IAAA,OAAgB,IAAI,GAAG,iCAAiC;IAExD,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,yBAAyB,CAAA;AAGR,IAAA,KAAA;AAF5B,IAAA,OAAgB,IAAI,GAAG,6CAA6C;AAEpE,IAAA,WAAA,CAA4B,KAAwB,EAAA;QAAxB,IAAA,CAAA,KAAK,GAAL,KAAK;IAAsB;;;ICN7C;AAAZ,CAAA,UAAY,sBAAsB,EAAA;AAChC,IAAA,sBAAA,CAAA,eAAA,CAAA,GAAA,eAA+B;AAC/B,IAAA,sBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,sBAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,sBAAA,CAAA,2BAAA,CAAA,GAAA,2BAAuD;AACzD,CAAC,EALW,sBAAsB,KAAtB,sBAAsB,GAAA,EAAA,CAAA,CAAA;;;;;;;;ACTlC,MAAM,aAAa,GAA4B;AAC7C,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,cAAc,EAAE,EAAE;AAClB,IAAA,aAAa,EAAE,EAAE;AACjB,IAAA,MAAM,EAAE,EAAE;AACV,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,UAAU,EAAE,EAAE;CACf;AAOM,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,aAIvC,CAAA;AACkB,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;IACzB,OAAO,GAAG,YAAY;IACtB,gBAAgB,GAAG,wBAAwB;;;;AAOrD,IAAP,OAAO,aAAa,CAClB,KAA8B,EAAA;QAE9B,OAAO,KAAK,CAAC,UAAU;IACzB;AAGO,IAAP,OAAO,QAAQ,CAAC,KAA8B,EAAA;QAC5C,OAAO,KAAK,CAAC,KAAK;IACpB;AAGO,IAAP,OAAO,iBAAiB,CACtB,KAA8B,EAAA;QAE9B,OAAO,KAAK,CAAC,cAAc;IAC7B;AAGO,IAAP,OAAO,WAAW,CAAC,KAA8B,EAAA;QAC/C,OAAO,KAAK,CAAC,QAAQ;IACvB;AAGO,IAAP,OAAO,aAAa,CAAC,KAA8B,EAAA;QACjD,OAAO,KAAK,CAAC,UAAU;IACzB;;;;AAOO,IAAP,OAAO,gBAAgB,CAAC,KAA8B,EAAA;QACpD,OAAO,KAAK,CAAC,aAAa;IAC5B;AAGO,IAAP,OAAO,SAAS,CACd,KAA8B,EAAA;QAE9B,OAAO,KAAK,CAAC,MAAM;IACrB;;;;AAOA,IAAA,QAAQ,CAAC,GAA0C,EAAA;AACjD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CACxB,CAAA,EAAG,IAAI,CAAC,gBAAgB,CAAA,MAAA,CAAQ,CACjC;AAED,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,sBAAsB,CAAC,QAAQ;AACpC,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,CAAC,QAAQ,MAAM;AACxB,gBAAA,KAAK,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;aAC3B,CAAC;AACH,SAAA,CAAC;IACJ;IAGA,aAAa,CACX,GAA0C,EAC1C,MAAwB,EAAA;AAExB,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAE9C,QAAA,MAAM,MAAM,GAAG;YACb,GAAG,MAAM,CAAC,MAAM;YAChB,UAAU;SACX;AAED,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CACxB,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,QAAA,CAAU,EACzB,EAAE,MAAM,EAAE,CACX;AAED,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,sBAAsB,CAAC,aAAa;AACzC,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,CAAC,QAAQ,MAAM;AACxB,gBAAA,UAAU,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;aAChC,CAAC;AACH,SAAA,CAAC;IACJ;IAGA,iBAAiB,CACf,GAA0C,EAC1C,MAAsC,EAAA;AAEtC,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAE9C,QAAA,MAAM,MAAM,GAAsC,EAAE,UAAU,EAAE;AAChE,QAAA,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE;AAC3B,YAAA,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,QAAQ;QACtC;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CACxB,IAAI,CAAC,gBAAgB,EACrB,EAAE,MAAM,EAAE,CACX;AAED,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,sBAAsB,CAAC,iBAAiB;AAC7C,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,CAAC,QAAQ,MAAM;AACxB,gBAAA,cAAc,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;aACpC,CAAC;AACH,SAAA,CAAC;IACJ;IAGA,aAAa,CACX,GAA0C,EAC1C,MAAkC,EAAA;QAElC,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;QAEA,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;IAGA,yBAAyB,CACvB,GAA0C,EAC1C,MAAiC,EAAA;AAEjC,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAE9C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CACxB,CAAA,EAAG,IAAI,CAAC,gBAAgB,eAAe,EACvC;YACE,UAAU;YACV,KAAK,EAAE,MAAM,CAAC,KAAK;AACpB,SAAA,CACF;AAED,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,sBAAsB,CAAC,yBAAyB;AACrD,YAAA,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,MAAK;;gBAEd,MAAM,UAAU,GAA2B,EAAE;AAC7C,gBAAA,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE;AAC/B,oBAAA,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE;wBAClC,UAAU,CAAC,IAAI,CAAC;4BACd,UAAU;4BACV,OAAO,EAAE,EAAE,CAAC,OAAO;4BACnB,WAAW,EAAE,IAAI,CAAC,WAAW;4BAC7B,KAAK,EAAE,EAAE,CAAC,KAAK;4BACf,aAAa,EAAE,EAAE,CAAC,aAAa;AAChC,yBAAA,CAAC;oBACJ;gBACF;AACA,gBAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE;YACvC,CAAC;AACF,SAAA,CAAC;IACJ;;;;AAMQ,IAAA,eAAe,CAAC,KAA8B,EAAA;QACpD,MAAM,YAAY,GAAa,EAAE;QACjC,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,cAAc,EAAE;AAClD,YAAA,YAAY,CAAC,IAAI,CAAC,CAAA,EAAG,KAAK,CAAC,gBAAgB,CAAA,CAAA,EAAI,KAAK,CAAC,cAAc,CAAA,CAAE,CAAC;QACxE;QACA,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE;AACtC,YAAA,YAAY,CAAC,IAAI,CAAC,CAAA,EAAG,KAAK,CAAC,UAAU,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,CAAA,CAAE,CAAC;QAC5D;AACA,QAAA,OAAO,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/B;uGA/MW,kBAAkB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAlB,kBAAkB,EAAA,CAAA;;AA+D7B,UAAA,CAAA;IADC,MAAM,CAAC,qBAAqB;AAc5B,CAAA,EAAA,kBAAA,CAAA,SAAA,EAAA,UAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;IADC,MAAM,CAAC,gBAAgB;AA0BvB,CAAA,EAAA,kBAAA,CAAA,SAAA,EAAA,eAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;IADC,MAAM,CAAC,8BAA8B;AA0BrC,CAAA,EAAA,kBAAA,CAAA,SAAA,EAAA,mBAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;IADC,MAAM,CAAC,0BAA0B;AAmBjC,CAAA,EAAA,kBAAA,CAAA,SAAA,EAAA,eAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;IADC,MAAM,CAAC,yBAAyB;AAqChC,CAAA,EAAA,kBAAA,CAAA,SAAA,EAAA,2BAAA,EAAA,IAAA,CAAA;AAlLM,UAAA,CAAA;AADN,IAAA,QAAQ;AAKR,CAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAKR,CAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,IAAA,CAAA;AAOM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAKR,CAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,IAAA,CAAA;AAxDU,kBAAkB,GAAA,UAAA,CAAA;AAL9B,IAAA,KAAK,CAA0B;AAC9B,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,QAAQ,EAAE,aAAa;KACxB;AAEY,CAAA,EAAA,kBAAkB,CAgN9B;2FAhNY,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;MClBY,mBAAmB,CAAA;AACb,IAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;;;;AAK7B,IAAA,UAAU,GAAG,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC;AACrD,IAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC;AAC3C,IAAA,cAAc,GAAG,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,CAAC;AAC7D,IAAA,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC;AACjD,IAAA,UAAU,GAAG,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC;;;;AAK7C,IAAA,aAAa,GAAG,MAAM,CAAC,kBAAkB,CAAC,gBAAgB,CAAC;AAC3D,IAAA,MAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC;;;;AAKrD,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MACtC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC,aAAa,CAAC,+DACpE;AAEQ,IAAA,cAAc,GAAG,QAAQ,CAAC,MACjC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC,QAAQ,CAAC,0DAC/D;AAEQ,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAC1C,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,mEACxE;AAEQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAC3B,sBAAsB,CAAC,yBAAyB,CACjD,2DACF;;;;AAKQ,IAAA,eAAe,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,sBAAsB,CAAC,aAAa,CAAC,IAAI,IAAI,2DAClE;AAEQ,IAAA,UAAU,GAAG,QAAQ,CAC5B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,IAAI,sDAC7D;AAEQ,IAAA,mBAAmB,GAAG,QAAQ,CACrC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,IAAI,IAAI,+DACtE;AAEQ,IAAA,gBAAgB,GAAG,QAAQ,CAClC,MACE,IAAI,CAAC,MAAM,EAAE,CAAC,sBAAsB,CAAC,yBAAyB,CAAC,IAAI,IAAI,4DAC1E;;;;IAMD,SAAS,GAAA;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,qBAAqB,EAAE,CAAC;IACzD;AAEA,IAAA,cAAc,CAAC,MAAgC,EAAA;AAC7C,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC1D;AAEA,IAAA,kBAAkB,CAAC,QAAmB,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IAC1E;AAEA,IAAA,yBAAyB,CAAC,KAAwB,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAClE;IAEA,aAAa,CACX,UAAkB,EAClB,QAAyB,EACzB,gBAAyB,EACzB,cAAgC,EAChC,UAAmB,EAAA;QAEnB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,IAAI,0BAA0B,CAC5B,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,UAAU,CACX,CACF;IACH;uGA/FW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA;;2FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCYY,oBAAoB,CAAA;AACZ,IAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACrC,IAAA,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;AACtB,IAAA,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC;;AAG5C,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,uDAAC;AAC/B,IAAA,YAAY,GAAG,KAAK,CAAS,EAAE,wDAAC;AAChC,IAAA,QAAQ,GAAG,KAAK,CAAiB,MAAM,oDAAC;AACxC,IAAA,OAAO,GAAG,KAAK,CAAS,MAAM,mDAAC;AAC/B,IAAA,YAAY,GAAG,KAAK,CAAS,CAAC,wDAAC;IAC/B,aAAa,GAAG,KAAK,CAAqB;AACjD,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,eAAe,EAAE,KAAK;AACtB,QAAA,eAAe,EAAE,KAAK;AACtB,QAAA,SAAS,EAAE,KAAK;AACjB,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAGO,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAC1B,IAAA,iBAAiB,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC;AAC1C,IAAA,sBAAsB,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC;AAC/C,IAAA,sBAAsB,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC;AAC/C,IAAA,gBAAgB,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC;;AAGzC,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MACnC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,4DAC5C;AACQ,IAAA,cAAc,GAAG,QAAQ,CAAC,MACjC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,0DAC1C;AAED,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;YACnC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC;YAC7D,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,IAAI,KAAK,CAAC;YACvE,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,IAAI,KAAK,CAAC;YACvE,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;AAC7D,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,GAAA;;AAEJ,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC;AACzB,aAAA,cAAc;aACd,IAAI,CACH,CAAC,CAAC,KACA,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CACvE;QACH,MAAM,YAAY,GAAG,cAAc,EAAE,aAAa,GAAG,MAAM,CAAC;QAE5D,MAAM,aAAa,GAA4B,EAAE;;AAGjD,QAAA,IAAI,YAAY,IAAI,IAAI,EAAE;AACxB,YAAA,aAAa,CAAC,MAAM,CAAC,GAAG,YAAY;QACtC;AAEA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;YAC3B,aAAa,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,IAAI,KAAK;QACrE;AACA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;YACzB,aAAa,CAAC,iBAAiB,CAAC;AAC9B,gBAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,IAAI,KAAK;YAC5C,aAAa,CAAC,iBAAiB,CAAC;AAC9B,gBAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,IAAI,KAAK;YAC5C,aAAa,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,IAAI,KAAK;QACnE;AAEA,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,YAAA,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE;YAC1B,aAAa;SACd;;QAGD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;AAC5C,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2C;AAEnE,QAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;;AAEvB,YAAA,IACE,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,EAAE;gBACpC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,EAC5B;gBACA;YACF;YACA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE;gBAChC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACjC;YACA,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAE,CAAC,IAAI,CAAC;gBAChC,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,aAAa,EAAE,CAAC,CAAC,aAAa;AAC/B,aAAA,CAAC;QACJ;;QAGA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE;YACrC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;QACtC;AACA,QAAA,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAE,CAAC,IAAI,CAAC,cAAc,CAAC;AAEtD,QAAA,MAAM,KAAK,GAAsB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CACjE,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CACjE;AAED,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;YACrD,IAAI,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAChC,KAAK,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AACxC,SAAA,CAAC;IACJ;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;IACtB;uGAvHW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,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,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5BjC,sxDAsDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED7BY,kBAAkB,+LAAE,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,EAAE,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,EAAE,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,CAAA,EAAA,CAAA;;2FAG3D,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;+BACE,2BAA2B,EAAA,UAAA,EACzB,IAAI,EAAA,OAAA,EACP,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,EAAE,WAAW,CAAC,EAAA,QAAA,EAAA,sxDAAA,EAAA;;;ME4B5D,aAAa,CAAA;AACL,IAAA,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACtC,IAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;;AAGjC,IAAA,iBAAiB,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC;AAE1D,IAAA,WAAW,GAAG,MAAM,CAAC,EAAE,uDAAC;AACxB,IAAA,UAAU,GAAG,MAAM,CAAgB,IAAI,sDAAC;;AAGxC,IAAA,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU;AACnC,IAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK;AACzB,IAAA,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB;AAC3C,IAAA,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc;IAC3C,gBAAgB,GAAG,QAAQ,CAClC,MACE,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE;AACrC,QAAA,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,4DACpC;AAEQ,IAAA,SAAS,GAAG,QAAQ,CAAC,MAC5B,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,qDACpE;;AAGQ,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;AAC5C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAE9B,QAAA,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAE9D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AACvB,YAAA,GAAG,CAAC;YACJ,OAAO,EAAE,OAAO,CAAC,IAAI,CACnB,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,aAAa,CAC/D;AACF,SAAA,CAAC,CAAC;AACL,IAAA,CAAC,iEAAC;AAEO,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;AACrD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE;AAEzC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AAEvB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AAC1B,YAAA,MAAM,IAAI,GACR,OAAO,IAAI,CAAC,IAAI,KAAK;kBACjB,IAAI,CAAC;AACP,kBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YACxC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC3C,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,8DAAC;;AAGF,IAAA,eAAe,GAAG,MAAM,CAAe,EAAE,2DAAC;AAE1C,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;AAC1C,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACnC;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;AAC5C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;YAE9B,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B;YACF;AAEA,YAAA,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC;YAC7D,MAAM,QAAQ,GAAG;AACd,iBAAA,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC;iBACzD,MAAM,CAAC,CAAC,CAAC,KAAsB,CAAC,KAAK,IAAI;iBACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;AAElD,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;AACpC,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;;AAEN,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AAEvB,QAAA,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;IAClC;IAEA,gBAAgB,CACd,IAAsD,EACtD,OAAgB,EAAA;QAEhB,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACvB;aAAO;;AAEL,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC;QAC1C;IACF;AAEA,IAAA,cAAc,CAAC,IAA+B,EAAA;AAC5C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,IAAI,CAAC,IAAI;YAAE;QAEX,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;QAC5C,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CACjC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,aAAa,CAClE;AAED,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC;IACvC;AAEA,IAAA,eAAe,CAAC,KAAwB,EAAA;AACtC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,IAAI,CAAC,IAAI;YAAE;QAEX,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;;QAG5C,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KACnC,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,KAAK,KAAK,CAAC,MAAM,CAAC;AACnD,cAAE,EAAE,GAAG,CAAC,EAAE,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;cAClE,CAAC,CACN;;QAGD,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE;IAC1D;AAEA,IAAA,mBAAmB,CAAC,QAAsB,EAAA;AACxC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,IAAI,CAAC,IAAI;YAAE;QAEX,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;QAC5C,MAAM,KAAK,GAAsB,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,KAAI;YAC9D,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CACjC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,aAAa,CACpE;YACD,OAAO;gBACL,WAAW,EAAE,MAAM,CAAC,aAAc;AAClC,gBAAA,YAAY,EAAE;AACZ,oBAAA;AACE,wBAAA,OAAO,EAAE,IAAI;wBACb,KAAK,EAAE,KAAK,GAAG,CAAC;AAChB,wBAAA,aAAa,EAAE,cAAc,EAAE,aAAa,IAAI,EAAE;AACnD,qBAAA;AACF,iBAAA;aACF;AACH,QAAA,CAAC,CAAC;;AAGF,QAAA,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC;QAClE,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC;;QAGpE,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC;QAE1D,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC,SAAS,EAAE;IAChE;;AAIA;;;AAGG;AACK,IAAA,eAAe,CAAC,kBAA0B,EAAA;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;AAC5C,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAC9B,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,kBAAkB,CAC5C;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE;IAC1D;AAEA;;AAEG;AACK,IAAA,sBAAsB,CAC5B,OAA+B,EAAA;AAE/B,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2C;AAE9D,QAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;YACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE;gBAC3B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5B;YACA,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAE,CAAC,IAAI,CAAC;gBAC3B,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,aAAa,EAAE,CAAC,CAAC,aAAa;AAC/B,aAAA,CAAC;QACJ;QAEA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,MAAM;YACrE,WAAW;YACX,YAAY;AACb,SAAA,CAAC,CAAC;IACL;AAEA;;;AAGG;IACK,UAAU,CAChB,OAA0B,EAC1B,SAA4B,EAAA;AAE5B,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2C;AAE9D,QAAA,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;AAC1B,YAAA,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QACnD;AAEA,QAAA,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;YAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;YAC1C,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;YACrC;iBAAO;AACL,gBAAA,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;YACnD;QACF;QAEA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,MAAM;YACrE,WAAW;YACX,YAAY;AACb,SAAA,CAAC,CAAC;IACL;IAEQ,UAAU,CAChB,IAA+B,EAC/B,cAAqC,EAAA;AAErC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,IAAI,CAAC,IAAI;YAAE;QAEX,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;AAC5C,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC;QAC7D,MAAM,SAAS,GAAG,cAAc,EAAE,KAAK,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAEjE,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC;AACrD,QAAA,MAAM,GAAG,GAAG,cAAc,EAAE,aAAa;AACzC,QAAA,MAAM,UAAU,GAAuB;AACrC,YAAA,UAAU,EAAG,GAAG,GAAG,YAAY,CAAa,IAAI,KAAK;AACrD,YAAA,eAAe,EAAG,GAAG,GAAG,iBAAiB,CAAa,IAAI,KAAK;AAC/D,YAAA,eAAe,EAAG,GAAG,GAAG,iBAAiB,CAAa,IAAI,KAAK;AAC/D,YAAA,SAAS,EAAG,GAAG,GAAG,WAAW,CAAa,IAAI,KAAK;SACpD;QAED,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,oBAAoB,EAAE,QAAQ,EAAE;AAC1D,YAAA,MAAM,EAAE,WAAW;AACnB,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,UAAU,EAAE,iCAAiC;AAC7C,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,QAAQ,EAAE,eAAe;AACzB,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,WAAW,EAAE;gBACX,WAAW,EAAE,IAAI,CAAC,aAAa;AAC/B,gBAAA,YAAY,EAAE,WAAW;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,YAAY,EAAE,SAAS;AACvB,gBAAA,aAAa,EAAE,UAAU;AAC1B,aAAA;AACF,SAAA,CAAC;IACJ;IAEQ,qBAAqB,CAC3B,MAA4B,EAC5B,KAAkC,EAAA;AAElC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,aAAa,KAAK,MAAM,CAAC,WAAW,CAAC;AACtE,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;QAEtB,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC;AACrD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAA0B;AAEhD,QAAA,MAAM,MAAM,GAAe;YACzB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,UAAU,EAAE,IAAI,CAAC,EAAE;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,aAAa,EAAE,IAAI,CAAC,aAAa;AACjC,YAAA,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC;YACtD,QAAQ,EAAE,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,WAAW,CAAC;YAC5D,QAAQ;YACR,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,aAAa,EAAE,MAAM,CAAC,aAA4C;SACnE;;AAGD,QAAA,IAAI,QAAQ,KAAK,MAAM,EAAE;AACvB,YAAA,MAAM,CAAC,WAAW,GAAG,UAAU;AAC/B,YAAA,MAAM,CAAC,QAAQ,GAAG,EAAE;AACpB,YAAA,MAAM,CAAC,WAAW,GAAG,aAAa;AAClC,YAAA,MAAM,CAAC,KAAK,GAAG,kBAAkB;QACnC;AAEA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,sBAAsB,CAAC,IAA+B,EAAA;AAC5D,QAAA,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,IAAI;QACnD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC9C,YAAA,QACG,IAAI,CAAC,IAA+B,CAAC,SAAS,CAAC;gBAChD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,CAAC,GAAG;QAEZ;QACA,OAAO,IAAI,CAAC,GAAG;IACjB;IAEQ,mBAAmB,CACzB,QAAwB,EACxB,IAAY,EAAA;QAEZ,QAAQ,QAAQ;AACd,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,aAAa;AACtB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,YAAY;AACrB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,kBAAkB;AAC3B,YAAA,KAAK,YAAY;AACf,gBAAA,OAAO,KAAK;AACd,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAC3D,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,WAAW;AACpB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,UAAU;AACnB,YAAA;AACE,gBAAA,OAAO,IAAI;;IAEjB;IAEQ,sBAAsB,CAC5B,QAAwB,EACxB,IAAY,EAAA;QAEZ,QAAQ,QAAQ;AACd,YAAA,KAAK,YAAY;AACf,gBAAA,OAAO,IAAI;AAEb,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,MAAM;AACf,YAAA;AACE,gBAAA,OAAO,IAAI;;IAEjB;uGA1WW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,4ECrD1B,quLA+IA,EAAA,MAAA,EAAA,CAAA,+CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxGI,WAAW,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,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,kBAAkB,gMAClB,IAAI,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,SAAS,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACT,WAAW,2NACX,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,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,WAAA,EAAA,IAAA,EAEJ,QAAQ,gJACR,cAAc,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAKL,aAAa,EAAA,UAAA,EAAA,CAAA;kBAlBzB,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP;wBACP,WAAW;wBACX,kBAAkB;wBAClB,IAAI;wBACJ,SAAS;wBACT,WAAW;wBACX,MAAM;wBACN,IAAI;wBACJ,IAAI;wBACJ,QAAQ;wBACR,cAAc;AACf,qBAAA,EAAA,QAAA,EAAA,quLAAA,EAAA,MAAA,EAAA,CAAA,+CAAA,CAAA,EAAA;;;AEjDH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"masterteam-customization.mjs","sources":["../../../../packages/masterteam/customization/src/lib/customization.model.ts","../../../../packages/masterteam/customization/src/store/customization/customization.actions.ts","../../../../packages/masterteam/customization/src/store/customization/customization.model.ts","../../../../packages/masterteam/customization/src/store/customization/customization.state.ts","../../../../packages/masterteam/customization/src/store/customization/customization.facade.ts","../../../../packages/masterteam/customization/src/lib/property-config-drawer/property-config-drawer.ts","../../../../packages/masterteam/customization/src/lib/property-config-drawer/property-config-drawer.html","../../../../packages/masterteam/customization/src/lib/customization.ts","../../../../packages/masterteam/customization/src/lib/customization.html","../../../../packages/masterteam/customization/src/masterteam-customization.ts"],"sourcesContent":["// Re-export entity types from the canonical source\r\nexport type {\r\n EntityViewType,\r\n EntitySize,\r\n EntityData,\r\n EntityStatusValue,\r\n EntityLookupValue,\r\n EntityUserValue,\r\n EntityResizeEvent,\r\n} from '@masterteam/components/entities';\r\n\r\nimport type { EntityViewType } from '@masterteam/components/entities';\r\n\r\n// ── Preview-specific models ──\r\n\r\n/**\r\n * Configuration for a property that can be edited via the drawer.\r\n * Note: `size` is managed via mouse-drag resize, not the edit drawer.\r\n */\r\nexport interface PropertyEditConfig {\r\n showBorder: boolean;\r\n /** User viewType only */\r\n showDisplayName: boolean;\r\n showPhoneNumber: boolean;\r\n showEmail: boolean;\r\n}\r\n\r\n/** ViewTypes that support the 'showBorder' toggle */\r\nexport const BORDER_VIEW_TYPES: EntityViewType[] = [\r\n 'Text',\r\n 'LongText',\r\n 'Currency',\r\n 'Date',\r\n 'DateTime',\r\n];\r\n\r\n/** ViewTypes that support user-specific toggles */\r\nexport const USER_VIEW_TYPES: EntityViewType[] = ['User'];\r\n\r\n/**\r\n * ViewTypes that have editable configuration fields in the drawer.\r\n * If a viewType is NOT in this list, the edit button is hidden\r\n * (since size is now managed via drag-resize only).\r\n */\r\nexport const EDITABLE_VIEW_TYPES: EntityViewType[] = [\r\n ...BORDER_VIEW_TYPES,\r\n ...USER_VIEW_TYPES,\r\n];\r\n","import type { BulkReplaceItem } from './api.model';\r\n\r\nexport class GetCustomization {\r\n static readonly type = '[Customization] Get Properties';\r\n\r\n constructor(public readonly params?: Record<string, unknown>) {}\r\n}\r\n\r\nexport class GetManagePreviewAreas {\r\n static readonly type = '[Customization] Get Areas';\r\n}\r\n\r\nexport class GetManagePreviewConfigurations {\r\n static readonly type = '[Customization] Get Configurations';\r\n\r\n constructor(public readonly areaKeys?: string[]) {}\r\n}\r\n\r\nexport class SetManagePreviewModuleInfo {\r\n static readonly type = '[Customization] 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 BulkReplaceConfigurations {\r\n static readonly type = '[Customization] Bulk Replace Configurations';\r\n\r\n constructor(public readonly items: BulkReplaceItem[]) {}\r\n}\r\n","import type { LoadingStateShape } from '@masterteam/components';\r\nimport type { DisplayArea, DisplayConfiguration } from './api.model';\r\n\r\nexport interface ManagePreviewPropertyItem {\r\n id: number;\r\n key: string;\r\n normalizedKey: string;\r\n viewType: string;\r\n viewTypeLabel: string;\r\n name: string | Record<string, string>;\r\n description?: Record<string, string>;\r\n defaultValue?: unknown;\r\n order?: number;\r\n enabled?: boolean;\r\n isSystem?: boolean;\r\n isBasic?: boolean;\r\n isCalculated?: boolean;\r\n isConfigurable?: boolean;\r\n isRequired?: boolean;\r\n isTranslatable?: boolean;\r\n shownInTable?: boolean;\r\n includeInSummary?: boolean;\r\n category?: string;\r\n configuration?: Record<string, unknown>;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport enum CustomizationActionKey {\r\n GetProperties = 'getProperties',\r\n GetAreas = 'getAreas',\r\n GetConfigurations = 'getConfigurations',\r\n BulkReplaceConfigurations = 'bulkReplaceConfigurations',\r\n}\r\n\r\nexport interface CustomizationStateModel extends LoadingStateShape<CustomizationActionKey> {\r\n properties: ManagePreviewPropertyItem[];\r\n areas: DisplayArea[];\r\n configurations: DisplayConfiguration[];\r\n moduleType: string | null;\r\n moduleId: string | number | null;\r\n parentModuleType: string | null;\r\n parentModuleId: string | number | null;\r\n parentPath: string;\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport { CrudStateBase, handleApiRequest } from '@masterteam/components';\r\nimport {\r\n CustomizationActionKey,\r\n CustomizationStateModel,\r\n ManagePreviewPropertyItem,\r\n} from './customization.model';\r\nimport {\r\n GetCustomization,\r\n GetManagePreviewAreas,\r\n GetManagePreviewConfigurations,\r\n SetManagePreviewModuleInfo,\r\n BulkReplaceConfigurations,\r\n} from './customization.actions';\r\nimport { DisplayArea, DisplayConfiguration, Response } from './api.model';\r\n\r\nconst DEFAULT_STATE: CustomizationStateModel = {\r\n properties: [],\r\n areas: [],\r\n configurations: [],\r\n loadingActive: [],\r\n errors: {},\r\n moduleType: null,\r\n moduleId: null,\r\n parentModuleType: null,\r\n parentModuleId: null,\r\n parentPath: '',\r\n};\r\n\r\n@State<CustomizationStateModel>({\r\n name: 'customization',\r\n defaults: DEFAULT_STATE,\r\n})\r\n@Injectable()\r\nexport class CustomizationState extends CrudStateBase<\r\n ManagePreviewPropertyItem,\r\n CustomizationStateModel,\r\n CustomizationActionKey\r\n> {\r\n private readonly http = inject(HttpClient);\r\n private readonly baseUrl = 'Properties';\r\n private readonly displayConfigUrl = 'display-configurations';\r\n\r\n // ============================================================================\r\n // Data Selectors - Individual for fine-grained reactivity\r\n // ============================================================================\r\n\r\n @Selector()\r\n static getProperties(\r\n state: CustomizationStateModel,\r\n ): ManagePreviewPropertyItem[] {\r\n return state.properties;\r\n }\r\n\r\n @Selector()\r\n static getAreas(state: CustomizationStateModel): DisplayArea[] {\r\n return state.areas;\r\n }\r\n\r\n @Selector()\r\n static getConfigurations(\r\n state: CustomizationStateModel,\r\n ): DisplayConfiguration[] {\r\n return state.configurations;\r\n }\r\n\r\n @Selector()\r\n static getModuleId(state: CustomizationStateModel): string | number | null {\r\n return state.moduleId;\r\n }\r\n\r\n @Selector()\r\n static getModuleType(state: CustomizationStateModel): string | null {\r\n return state.moduleType;\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: CustomizationStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: CustomizationStateModel,\r\n ): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n // ============================================================================\r\n // Actions\r\n // ============================================================================\r\n\r\n @Action(GetManagePreviewAreas)\r\n getAreas(ctx: StateContext<CustomizationStateModel>) {\r\n const req$ = this.http.get<Response<DisplayArea[]>>(\r\n `${this.displayConfigUrl}/areas`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.GetAreas,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n areas: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n @Action(GetCustomization)\r\n getProperties(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: GetCustomization,\r\n ) {\r\n const state = ctx.getState();\r\n const contextKey = this.buildContextKey(state);\r\n\r\n const params = {\r\n ...action.params,\r\n contextKey,\r\n };\r\n\r\n const req$ = this.http.get<Response<ManagePreviewPropertyItem[]>>(\r\n `${this.baseUrl}/catalog`,\r\n { params },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.GetProperties,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n properties: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n @Action(GetManagePreviewConfigurations)\r\n getConfigurations(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: GetManagePreviewConfigurations,\r\n ) {\r\n const state = ctx.getState();\r\n const contextKey = this.buildContextKey(state);\r\n\r\n const params: Record<string, string | string[]> = { contextKey };\r\n if (action.areaKeys?.length) {\r\n params['areaKeys'] = action.areaKeys;\r\n }\r\n\r\n const req$ = this.http.get<Response<DisplayConfiguration[]>>(\r\n this.displayConfigUrl,\r\n { params },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.GetConfigurations,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n configurations: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n @Action(SetManagePreviewModuleInfo)\r\n setModuleInfo(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: SetManagePreviewModuleInfo,\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\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(BulkReplaceConfigurations)\r\n bulkReplaceConfigurations(\r\n ctx: StateContext<CustomizationStateModel>,\r\n action: BulkReplaceConfigurations,\r\n ) {\r\n const state = ctx.getState();\r\n const contextKey = this.buildContextKey(state);\r\n\r\n const req$ = this.http.put<Response<boolean>>(\r\n `${this.displayConfigUrl}/bulk-replace`,\r\n {\r\n contextKey,\r\n items: action.items,\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: CustomizationActionKey.BulkReplaceConfigurations,\r\n request$: req$,\r\n onSuccess: () => {\r\n // Rebuild configurations from the items payload\r\n const newConfigs: DisplayConfiguration[] = [];\r\n for (const item of action.items) {\r\n for (const da of item.displayAreas) {\r\n newConfigs.push({\r\n contextKey,\r\n areaKey: da.areaKey,\r\n propertyKey: item.propertyKey,\r\n order: da.order,\r\n configuration: da.configuration,\r\n });\r\n }\r\n }\r\n return { configurations: newConfigs };\r\n },\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Private Helpers\r\n // ============================================================================\r\n\r\n private buildContextKey(state: CustomizationStateModel): string {\r\n const contextParts: string[] = [];\r\n if (state.parentModuleType && state.parentModuleId) {\r\n contextParts.push(`${state.parentModuleType}:${state.parentModuleId}`);\r\n }\r\n if (state.moduleType && state.moduleId) {\r\n contextParts.push(`${state.moduleType}:${state.moduleId}`);\r\n }\r\n return contextParts.join('/');\r\n }\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { select, Store } from '@ngxs/store';\r\nimport type { Observable } from 'rxjs';\r\nimport { CustomizationActionKey } from './customization.model';\r\nimport {\r\n GetCustomization,\r\n GetManagePreviewAreas,\r\n GetManagePreviewConfigurations,\r\n SetManagePreviewModuleInfo,\r\n BulkReplaceConfigurations,\r\n} from './customization.actions';\r\nimport { CustomizationState } from './customization.state';\r\nimport type { BulkReplaceItem } from './api.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CustomizationFacade {\r\n private readonly store = inject(Store);\r\n\r\n // ============================================================================\r\n // Data Selectors - Memoized by NGXS (fine-grained reactivity)\r\n // ============================================================================\r\n readonly properties = select(CustomizationState.getProperties);\r\n readonly areas = select(CustomizationState.getAreas);\r\n readonly configurations = select(CustomizationState.getConfigurations);\r\n readonly moduleId = select(CustomizationState.getModuleId);\r\n readonly moduleType = select(CustomizationState.getModuleType);\r\n\r\n // ============================================================================\r\n // Loading/Error Slices - Memoized by NGXS\r\n // ============================================================================\r\n private readonly loadingActive = select(CustomizationState.getLoadingActive);\r\n private readonly errors = select(CustomizationState.getErrors);\r\n\r\n // ============================================================================\r\n // Loading Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly isLoadingProperties = computed(() =>\r\n this.loadingActive().includes(CustomizationActionKey.GetProperties),\r\n );\r\n\r\n readonly isLoadingAreas = computed(() =>\r\n this.loadingActive().includes(CustomizationActionKey.GetAreas),\r\n );\r\n\r\n readonly isLoadingConfigurations = computed(() =>\r\n this.loadingActive().includes(CustomizationActionKey.GetConfigurations),\r\n );\r\n\r\n readonly isBulkReplacing = computed(() =>\r\n this.loadingActive().includes(\r\n CustomizationActionKey.BulkReplaceConfigurations,\r\n ),\r\n );\r\n\r\n // ============================================================================\r\n // Error Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly propertiesError = computed(\r\n () => this.errors()[CustomizationActionKey.GetProperties] ?? null,\r\n );\r\n\r\n readonly areasError = computed(\r\n () => this.errors()[CustomizationActionKey.GetAreas] ?? null,\r\n );\r\n\r\n readonly configurationsError = computed(\r\n () => this.errors()[CustomizationActionKey.GetConfigurations] ?? null,\r\n );\r\n\r\n readonly bulkReplaceError = computed(\r\n () =>\r\n this.errors()[CustomizationActionKey.BulkReplaceConfigurations] ?? null,\r\n );\r\n\r\n // ============================================================================\r\n // Action Dispatchers\r\n // ============================================================================\r\n\r\n loadAreas(): Observable<unknown> {\r\n return this.store.dispatch(new GetManagePreviewAreas());\r\n }\r\n\r\n loadProperties(params?: Record<string, unknown>): Observable<unknown> {\r\n return this.store.dispatch(new GetCustomization(params));\r\n }\r\n\r\n loadConfigurations(areaKeys?: string[]): Observable<unknown> {\r\n return this.store.dispatch(new GetManagePreviewConfigurations(areaKeys));\r\n }\r\n\r\n bulkReplaceConfigurations(items: BulkReplaceItem[]): Observable<unknown> {\r\n return this.store.dispatch(new BulkReplaceConfigurations(items));\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 SetManagePreviewModuleInfo(\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","import {\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport type {\r\n EntityViewType,\r\n PropertyEditConfig,\r\n} from '../customization.model';\r\nimport { BORDER_VIEW_TYPES, USER_VIEW_TYPES } from '../customization.model';\r\nimport { CustomizationFacade } from '../../store';\r\nimport type { BulkReplaceItem } from '../../store/customization';\r\n\r\n@Component({\r\n selector: 'mt-property-config-drawer',\r\n standalone: true,\r\n imports: [TranslocoDirective, ReactiveFormsModule, Button, ToggleField],\r\n templateUrl: './property-config-drawer.html',\r\n})\r\nexport class PropertyConfigDrawer {\r\n protected readonly modalService = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n private readonly facade = inject(CustomizationFacade);\r\n\r\n // ─── Inputs (passed via drawer inputValues) ───\r\n readonly propertyKey = input<string>('');\r\n readonly propertyName = input<string>('');\r\n readonly viewType = input<EntityViewType>('Text');\r\n readonly areaKey = input<string>('card');\r\n readonly currentOrder = input<number>(1);\r\n readonly initialConfig = input<PropertyEditConfig>({\r\n showBorder: false,\r\n showDisplayName: false,\r\n showPhoneNumber: false,\r\n showEmail: false,\r\n });\r\n\r\n // ─── UI state ───\r\n readonly submitting = signal(false);\r\n readonly showBorderControl = new FormControl(false);\r\n readonly showDisplayNameControl = new FormControl(false);\r\n readonly showPhoneNumberControl = new FormControl(false);\r\n readonly showEmailControl = new FormControl(false);\r\n\r\n // ─── Computed visibility flags ───\r\n readonly isBorderViewType = computed(() =>\r\n BORDER_VIEW_TYPES.includes(this.viewType()),\r\n );\r\n readonly isUserViewType = computed(() =>\r\n USER_VIEW_TYPES.includes(this.viewType()),\r\n );\r\n\r\n constructor() {\r\n // Initialize form from input config\r\n effect(() => {\r\n const config = this.initialConfig();\r\n this.showBorderControl.patchValue(config.showBorder ?? false);\r\n this.showDisplayNameControl.patchValue(config.showDisplayName ?? false);\r\n this.showPhoneNumberControl.patchValue(config.showPhoneNumber ?? false);\r\n this.showEmailControl.patchValue(config.showEmail ?? false);\r\n });\r\n }\r\n\r\n onSave(): void {\r\n // Preserve existing size from configuration (managed via drag-resize)\r\n const existingConfig = this.facade\r\n .configurations()\r\n .find(\r\n (c) =>\r\n c.propertyKey === this.propertyKey() && c.areaKey === this.areaKey(),\r\n );\r\n const existingSize = existingConfig?.configuration?.['size'];\r\n\r\n const configuration: Record<string, unknown> = {};\r\n\r\n // Carry over size so drag-resize value is not lost\r\n if (existingSize != null) {\r\n configuration['size'] = existingSize;\r\n }\r\n\r\n if (this.isBorderViewType()) {\r\n configuration['showBorder'] = this.showBorderControl.value ?? false;\r\n }\r\n if (this.isUserViewType()) {\r\n configuration['showDisplayName'] =\r\n this.showDisplayNameControl.value ?? false;\r\n configuration['showPhoneNumber'] =\r\n this.showPhoneNumberControl.value ?? false;\r\n configuration['showEmail'] = this.showEmailControl.value ?? false;\r\n }\r\n\r\n const newDisplayArea = {\r\n areaKey: this.areaKey(),\r\n order: this.currentOrder(),\r\n configuration,\r\n };\r\n\r\n // Build bulk items from existing configs, replacing the current property+area\r\n const configs = this.facade.configurations();\r\n const itemsMap = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const c of configs) {\r\n // Skip the entry being replaced\r\n if (\r\n c.propertyKey === this.propertyKey() &&\r\n c.areaKey === this.areaKey()\r\n ) {\r\n continue;\r\n }\r\n if (!itemsMap.has(c.propertyKey)) {\r\n itemsMap.set(c.propertyKey, []);\r\n }\r\n itemsMap.get(c.propertyKey)!.push({\r\n areaKey: c.areaKey,\r\n order: c.order,\r\n configuration: c.configuration,\r\n });\r\n }\r\n\r\n // Add/replace the current property's area config\r\n if (!itemsMap.has(this.propertyKey())) {\r\n itemsMap.set(this.propertyKey(), []);\r\n }\r\n itemsMap.get(this.propertyKey())!.push(newDisplayArea);\r\n\r\n const items: BulkReplaceItem[] = Array.from(itemsMap.entries()).map(\r\n ([propertyKey, displayAreas]) => ({ propertyKey, displayAreas }),\r\n );\r\n\r\n this.submitting.set(true);\r\n this.facade.bulkReplaceConfigurations(items).subscribe({\r\n next: () => this.ref.close(true),\r\n error: () => this.submitting.set(false),\r\n });\r\n }\r\n\r\n onCancel(): void {\r\n this.ref.close(null);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div [class]=\"[modalService.contentClass, 'p-4', 'overflow-y-hidden!']\">\r\n <div class=\"mt-2 h-full overflow-y-auto pb-10 flex flex-col gap-5\">\r\n <!-- Show Border Toggle (Text, Currency, Date, DateTime) -->\r\n @if (isBorderViewType()) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-border')\"\r\n icon=\"layout.layout-grid-01\"\r\n [formControl]=\"showBorderControl\"\r\n ></mt-toggle-field>\r\n }\r\n\r\n <!-- User-specific Toggles -->\r\n @if (isUserViewType()) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-display-name')\"\r\n icon=\"user.user-circle\"\r\n [formControl]=\"showDisplayNameControl\"\r\n ></mt-toggle-field>\r\n\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-phone-number')\"\r\n icon=\"communication.phone\"\r\n [formControl]=\"showPhoneNumberControl\"\r\n ></mt-toggle-field>\r\n\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n [label]=\"t('show-email')\"\r\n icon=\"communication.mail-01\"\r\n [formControl]=\"showEmailControl\"\r\n ></mt-toggle-field>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n severity=\"secondary\"\r\n [disabled]=\"submitting()\"\r\n (onClick)=\"onCancel()\"\r\n ></mt-button>\r\n <mt-button\r\n [label]=\"t('save')\"\r\n severity=\"primary\"\r\n [loading]=\"submitting()\"\r\n (onClick)=\"onSave()\"\r\n ></mt-button>\r\n </div>\r\n</ng-container>\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { EntitiesManage } from '@masterteam/components/entities';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Skeleton } from 'primeng/skeleton';\r\nimport type {\r\n EntityData,\r\n EntityViewType,\r\n EntityStatusValue,\r\n EntityLookupValue,\r\n EntityUserValue,\r\n EntityResizeEvent,\r\n PropertyEditConfig,\r\n} from './customization.model';\r\nimport { EDITABLE_VIEW_TYPES } from './customization.model';\r\nimport { CustomizationFacade } from '../store';\r\nimport type {\r\n ManagePreviewPropertyItem,\r\n DisplayConfiguration,\r\n BulkReplaceItem,\r\n} from '../store/customization';\r\nimport { PropertyConfigDrawer } from './property-config-drawer/property-config-drawer';\r\n\r\n@Component({\r\n selector: 'mt-customization',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n TranslocoDirective,\r\n Card,\r\n TextField,\r\n ToggleField,\r\n Button,\r\n Tabs,\r\n Icon,\r\n Skeleton,\r\n EntitiesManage,\r\n ],\r\n templateUrl: './customization.html',\r\n styleUrl: './customization.scss',\r\n})\r\nexport class Customization implements OnInit {\r\n protected readonly facade = inject(CustomizationFacade);\r\n private readonly modalService = inject(ModalService);\r\n\r\n /** Set of viewTypes that have editable fields in the drawer (beyond size) */\r\n protected readonly editableViewTypes = new Set(EDITABLE_VIEW_TYPES);\r\n\r\n readonly searchQuery = signal('');\r\n readonly activeArea = signal<string | null>(null);\r\n\r\n // ── Derived signals ──\r\n readonly properties = this.facade.properties;\r\n readonly areas = this.facade.areas;\r\n readonly isLoading = this.facade.isLoadingProperties;\r\n readonly isLoadingAreas = this.facade.isLoadingAreas;\r\n readonly isLoadingPreview = computed(\r\n () =>\r\n this.facade.isLoadingConfigurations() ||\r\n this.facade.isLoadingProperties(),\r\n );\r\n\r\n readonly areasTabs = computed(() =>\r\n this.areas().map((area) => ({ label: area.name, value: area.key })),\r\n );\r\n\r\n /** Properties enriched with `enabled` based on current area configurations */\r\n readonly propertiesWithEnabled = computed(() => {\r\n const props = this.properties();\r\n const configs = this.facade.configurations();\r\n const area = this.activeArea();\r\n\r\n if (!area) return props.map((p) => ({ ...p, enabled: false }));\r\n\r\n return props.map((p) => ({\r\n ...p,\r\n enabled: configs.some(\r\n (c) => c.areaKey === area && c.propertyKey === p.key,\r\n ),\r\n }));\r\n });\r\n\r\n readonly filteredProperties = computed(() => {\r\n const query = this.searchQuery().toLowerCase().trim();\r\n const list = this.propertiesWithEnabled();\r\n\r\n if (!query) return list;\r\n\r\n return list.filter((prop) => {\r\n const name =\r\n typeof prop.name === 'string'\r\n ? prop.name\r\n : Object.values(prop.name).join(' ');\r\n return name.toLowerCase().includes(query);\r\n });\r\n });\r\n\r\n /** Preview entities built from configurations + properties for the active area */\r\n previewEntities = signal<EntityData[]>([]);\r\n\r\n constructor() {\r\n // Set default active area when areas load\r\n effect(() => {\r\n const areas = this.areas();\r\n if (areas.length > 0 && !this.activeArea()) {\r\n this.activeArea.set(areas[0].key);\r\n }\r\n });\r\n\r\n // Rebuild preview entities when configs, properties, or active area change\r\n effect(() => {\r\n const configs = this.facade.configurations();\r\n const props = this.properties();\r\n const area = this.activeArea();\r\n\r\n if (!area || !props.length) {\r\n this.previewEntities.set([]);\r\n return;\r\n }\r\n\r\n const areaConfigs = configs.filter((c) => c.areaKey === area);\r\n const entities = areaConfigs\r\n .map((config) => this.buildEntityFromConfig(config, props))\r\n .filter((e): e is EntityData => e !== null)\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n\r\n this.previewEntities.set(entities);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n // Load display areas\r\n this.facade.loadAreas();\r\n\r\n this.facade.loadProperties();\r\n this.facade.loadConfigurations();\r\n }\r\n\r\n onPropertyToggle(\r\n prop: ManagePreviewPropertyItem & { enabled: boolean },\r\n enabled: boolean,\r\n ): void {\r\n if (enabled) {\r\n // If the viewType has configurable fields, open the drawer; otherwise save directly\r\n if (this.editableViewTypes.has(prop.viewType as EntityViewType)) {\r\n this.openDrawer(prop);\r\n } else {\r\n this.saveDirectly(prop);\r\n }\r\n } else {\r\n // Remove this property and bulk-replace with remaining checked props\r\n this.bulkSaveWithout(prop.key);\r\n }\r\n }\r\n\r\n onEditProperty(prop: ManagePreviewPropertyItem): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const existingConfig = configs.find(\r\n (c) => c.areaKey === area && c.propertyKey === prop.key,\r\n );\r\n\r\n this.openDrawer(prop, existingConfig);\r\n }\r\n\r\n onEntityResized(event: EntityResizeEvent): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n\r\n // Update the configuration for the resized entity in the current area\r\n const updatedConfigs = configs.map((c) =>\r\n c.areaKey === area && c.propertyKey === event.entity.key\r\n ? { ...c, configuration: { ...c.configuration, size: event.newSize } }\r\n : c,\r\n );\r\n\r\n // Build bulk-replace items from updated configs\r\n const items = this.groupConfigsByProperty(updatedConfigs);\r\n this.facade.bulkReplaceConfigurations(items).subscribe();\r\n }\r\n\r\n onEntitiesReordered(entities: EntityData[]): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const items: BulkReplaceItem[] = entities.map((entity, index) => {\r\n const existingConfig = configs.find(\r\n (c) => c.areaKey === area && c.propertyKey === entity.key,\r\n );\r\n return {\r\n propertyKey: entity.key!,\r\n displayAreas: [\r\n {\r\n areaKey: area,\r\n order: index + 1,\r\n configuration: existingConfig?.configuration ?? {},\r\n },\r\n ],\r\n };\r\n });\r\n\r\n // Include configs from other areas that are not being reordered\r\n const otherAreaConfigs = configs.filter((c) => c.areaKey !== area);\r\n const otherAreaItems = this.groupConfigsByProperty(otherAreaConfigs);\r\n\r\n // Merge: for properties that exist in both, combine their displayAreas\r\n const mergedItems = this.mergeItems(items, otherAreaItems);\r\n\r\n this.facade.bulkReplaceConfigurations(mergedItems).subscribe();\r\n }\r\n\r\n // ── Private helpers ──\r\n\r\n /**\r\n * Save a property directly without opening the drawer (for viewTypes with no configurable fields).\r\n */\r\n private saveDirectly(prop: ManagePreviewPropertyItem): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const areaConfigs = configs.filter((c) => c.areaKey === area);\r\n const nextOrder = areaConfigs.length + 1;\r\n\r\n const newDisplayArea = {\r\n areaKey: area,\r\n order: nextOrder,\r\n configuration: {} as Record<string, unknown>,\r\n };\r\n\r\n // Build bulk items from existing configs + new property\r\n const itemsMap = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const c of configs) {\r\n if (!itemsMap.has(c.propertyKey)) {\r\n itemsMap.set(c.propertyKey, []);\r\n }\r\n itemsMap.get(c.propertyKey)!.push({\r\n areaKey: c.areaKey,\r\n order: c.order,\r\n configuration: c.configuration,\r\n });\r\n }\r\n\r\n // Add the new property\r\n if (!itemsMap.has(prop.key)) {\r\n itemsMap.set(prop.key, []);\r\n }\r\n itemsMap.get(prop.key)!.push(newDisplayArea);\r\n\r\n const items: BulkReplaceItem[] = Array.from(itemsMap.entries()).map(\r\n ([propertyKey, displayAreas]) => ({ propertyKey, displayAreas }),\r\n );\r\n\r\n this.facade.bulkReplaceConfigurations(items).subscribe();\r\n }\r\n\r\n /**\r\n * Build bulk items from all current configurations, excluding a specific property.\r\n * Then call bulk-replace so the backend replaces the entire context atomically.\r\n */\r\n private bulkSaveWithout(excludePropertyKey: string): void {\r\n const configs = this.facade.configurations();\r\n const remaining = configs.filter(\r\n (c) => c.propertyKey !== excludePropertyKey,\r\n );\r\n const items = this.groupConfigsByProperty(remaining);\r\n this.facade.bulkReplaceConfigurations(items).subscribe();\r\n }\r\n\r\n /**\r\n * Group flat DisplayConfiguration[] into bulk-replace items grouped by propertyKey.\r\n */\r\n private groupConfigsByProperty(\r\n configs: DisplayConfiguration[],\r\n ): BulkReplaceItem[] {\r\n const map = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const c of configs) {\r\n if (!map.has(c.propertyKey)) {\r\n map.set(c.propertyKey, []);\r\n }\r\n map.get(c.propertyKey)!.push({\r\n areaKey: c.areaKey,\r\n order: c.order,\r\n configuration: c.configuration,\r\n });\r\n }\r\n\r\n return Array.from(map.entries()).map(([propertyKey, displayAreas]) => ({\r\n propertyKey,\r\n displayAreas,\r\n }));\r\n }\r\n\r\n /**\r\n * Merge two sets of bulk items. If a propertyKey exists in both,\r\n * combine their displayAreas arrays.\r\n */\r\n private mergeItems(\r\n primary: BulkReplaceItem[],\r\n secondary: BulkReplaceItem[],\r\n ): BulkReplaceItem[] {\r\n const map = new Map<string, BulkReplaceItem['displayAreas']>();\r\n\r\n for (const item of primary) {\r\n map.set(item.propertyKey, [...item.displayAreas]);\r\n }\r\n\r\n for (const item of secondary) {\r\n const existing = map.get(item.propertyKey);\r\n if (existing) {\r\n existing.push(...item.displayAreas);\r\n } else {\r\n map.set(item.propertyKey, [...item.displayAreas]);\r\n }\r\n }\r\n\r\n return Array.from(map.entries()).map(([propertyKey, displayAreas]) => ({\r\n propertyKey,\r\n displayAreas,\r\n }));\r\n }\r\n\r\n private openDrawer(\r\n prop: ManagePreviewPropertyItem,\r\n existingConfig?: DisplayConfiguration,\r\n ): void {\r\n const area = this.activeArea();\r\n if (!area) return;\r\n\r\n const configs = this.facade.configurations();\r\n const areaConfigs = configs.filter((c) => c.areaKey === area);\r\n const nextOrder = existingConfig?.order ?? areaConfigs.length + 1;\r\n\r\n const displayName = this.getPropertyDisplayName(prop);\r\n const cfg = existingConfig?.configuration;\r\n const initConfig: PropertyEditConfig = {\r\n showBorder: (cfg?.['showBorder'] as boolean) ?? false,\r\n showDisplayName: (cfg?.['showDisplayName'] as boolean) ?? false,\r\n showPhoneNumber: (cfg?.['showPhoneNumber'] as boolean) ?? false,\r\n showEmail: (cfg?.['showEmail'] as boolean) ?? false,\r\n };\r\n\r\n this.modalService.openModal(PropertyConfigDrawer, 'drawer', {\r\n header: displayName,\r\n height: '25vw',\r\n styleClass: '!w-[27%] !absolute !shadow-none',\r\n position: 'end',\r\n appendTo: '#page-content',\r\n dismissible: true,\r\n inputValues: {\r\n propertyKey: prop.key,\r\n propertyName: displayName,\r\n viewType: prop.viewType,\r\n areaKey: area,\r\n currentOrder: nextOrder,\r\n initialConfig: initConfig,\r\n },\r\n });\r\n }\r\n\r\n private buildEntityFromConfig(\r\n config: DisplayConfiguration,\r\n props: ManagePreviewPropertyItem[],\r\n ): EntityData | null {\r\n const prop = props.find((p) => p.key === config.propertyKey);\r\n if (!prop) return null;\r\n\r\n const displayName = this.getPropertyDisplayName(prop);\r\n const viewType = prop.viewType as EntityViewType;\r\n\r\n const entity: EntityData = {\r\n id: prop.id,\r\n propertyId: prop.id,\r\n key: prop.key,\r\n normalizedKey: prop.normalizedKey,\r\n name: displayName,\r\n value: this.getPlaceholderValue(viewType, displayName),\r\n rawValue: this.getPlaceholderRawValue(viewType, displayName),\r\n viewType,\r\n order: config.order,\r\n configuration: config.configuration as EntityData['configuration'],\r\n };\r\n\r\n return entity;\r\n }\r\n\r\n private getPropertyDisplayName(prop: ManagePreviewPropertyItem): string {\r\n if (typeof prop.name === 'string') return prop.name;\r\n if (prop.name && typeof prop.name === 'object') {\r\n return (\r\n (prop.name as Record<string, string>)['display'] ||\r\n Object.values(prop.name)[0] ||\r\n prop.key\r\n );\r\n }\r\n return prop.key;\r\n }\r\n\r\n private getPlaceholderValue(\r\n viewType: EntityViewType,\r\n name: string,\r\n ): string | EntityStatusValue | EntityLookupValue | EntityUserValue {\r\n switch (viewType) {\r\n case 'Text':\r\n return 'Sample Text';\r\n case 'LongText':\r\n return '<p>Sample long text content</p>';\r\n case 'Date':\r\n return '2026-01-15';\r\n case 'DateTime':\r\n return '2026-01-15 10:30';\r\n case 'Percentage':\r\n return '75%';\r\n case 'Status':\r\n return { key: 'sample', display: name, color: '#3B82F6' };\r\n case 'Lookup':\r\n return {\r\n key: 'sample',\r\n display: name,\r\n color: '#8B5CF6',\r\n description: '',\r\n };\r\n case 'Currency':\r\n return '$1,250.00';\r\n case 'Checkbox':\r\n return 'true';\r\n case 'User':\r\n return {\r\n displayName: 'Tesst User',\r\n photoUrl: '',\r\n phoneNumber: '+1234567890',\r\n email: 'user@example.com',\r\n };\r\n default:\r\n return name;\r\n }\r\n }\r\n\r\n private getPlaceholderRawValue(\r\n viewType: EntityViewType,\r\n name: string,\r\n ): string {\r\n switch (viewType) {\r\n case 'Percentage':\r\n return '75';\r\n\r\n case 'Checkbox':\r\n return 'true';\r\n default:\r\n return name;\r\n }\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div class=\"flex gap-6 h-full w-full overflow-hidden\">\r\n <!-- ─── Left Sidebar: Attributes Panel ─── -->\r\n <mt-card class=\"w-1/5 h-full flex flex-col overflow-hidden pb-3\">\r\n <ng-template #headless>\r\n <!-- Header -->\r\n <h3 class=\"text-xl font-semibold px-4 pt-5 pb-3\">\r\n {{ t(\"attributes\") }}\r\n </h3>\r\n\r\n <!-- Properties List -->\r\n <div class=\"flex-1 overflow-y-auto px-4 pb-4 space-y-3\">\r\n <!-- Search Field -->\r\n <div class=\"sticky top-0 bg-surface-0 mb-0 py-3 pb-2 mb-1 z-10\">\r\n <mt-text-field\r\n [placeholder]=\"t('search-properties')\"\r\n [(ngModel)]=\"searchQuery\"\r\n icon=\"general.search-lg\"\r\n />\r\n </div>\r\n @if (isLoading()) {\r\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\r\n <div class=\"flex items-center gap-1 p-1 rounded-lg\">\r\n <p-skeleton height=\"4rem\" />\r\n </div>\r\n }\r\n } @else {\r\n @for (prop of filteredProperties(); track prop.id) {\r\n <div\r\n class=\"flex items-center gap-3 p-3 rounded-lg border border-gray-300 border-dashed hover:bg-emphasis transition-colors\"\r\n >\r\n <!-- Property Name -->\r\n <div class=\"flex-1 min-w-0 py-2\">\r\n <span\r\n class=\"text-sm font-medium truncate block\"\r\n [class.text-primary]=\"prop.enabled\"\r\n >\r\n {{ prop.name?.display }}\r\n </span>\r\n </div>\r\n\r\n <!-- Edit Button (visible when enabled and viewType has configurable fields) -->\r\n @if (prop.enabled && editableViewTypes.has(prop.viewType)) {\r\n <mt-button\r\n icon=\"editor.pencil-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n severity=\"primary\"\r\n (onClick)=\"onEditProperty(prop)\"\r\n />\r\n }\r\n\r\n <!-- Toggle -->\r\n <mt-toggle-field\r\n [ngModel]=\"prop.enabled\"\r\n (ngModelChange)=\"onPropertyToggle(prop, $event)\"\r\n class=\"shrink-0\"\r\n ></mt-toggle-field>\r\n </div>\r\n }\r\n\r\n @if (filteredProperties().length === 0) {\r\n <div class=\"py-8 text-center text-muted-color\">\r\n <p class=\"text-sm\">{{ t(\"no-properties\") }}</p>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n\r\n <!-- ─── Main Area: Preview ─── -->\r\n <div class=\"w-3/5 flex flex-col gap-4 h-full overflow-hidden items-center\">\r\n <!-- Area Tabs -->\r\n @if (isLoadingAreas()) {\r\n <div class=\"flex gap-2 py-1\">\r\n @for (i of [1, 2, 3]; track i) {\r\n <p-skeleton width=\"6rem\" height=\"2.25rem\" borderRadius=\"8px\" />\r\n }\r\n </div>\r\n } @else if (areasTabs().length > 0) {\r\n <mt-tabs\r\n [options]=\"areasTabs()\"\r\n [(active)]=\"activeArea\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n />\r\n }\r\n\r\n <!-- Entities Preview -->\r\n <mt-card class=\"w-150 flex-1 overflow-hidden\">\r\n <div>\r\n <ng-template #headless>\r\n <div class=\"overflow-auto h-full my-2 p-2\">\r\n @if (isLoadingPreview()) {\r\n <div class=\"grid grid-cols-24 gap-x-4 gap-y-7 p-4\">\r\n <div class=\"col-span-20 flex items-center gap-2.5 p-3\">\r\n <p-skeleton size=\"4rem\" shape=\"circle\" />\r\n <div class=\"flex flex-col gap-1 flex-1\">\r\n <p-skeleton height=\"2.5rem\" borderRadius=\"4px\" />\r\n </div>\r\n </div>\r\n @for (i of [1, 2, 3, 4]; track i) {\r\n <div class=\"col-span-8 flex flex-col gap-1.5 p-3\">\r\n <p-skeleton height=\"4rem\" borderRadius=\"6px\" />\r\n </div>\r\n }\r\n </div>\r\n } @else if (previewEntities().length > 0) {\r\n <mt-entities-manage\r\n [(entities)]=\"previewEntities\"\r\n (entitiesReordered)=\"onEntitiesReordered($event)\"\r\n (entityResized)=\"onEntityResized($event)\"\r\n />\r\n } @else {\r\n <div\r\n class=\"flex items-center justify-center h-full text-muted-color\"\r\n >\r\n <p class=\"text-sm\">{{ t(\"no-preview-items\") }}</p>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </div>\r\n </mt-card>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masterteam/customization",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"directory": "../../../dist/masterteam/customization",
|
|
6
6
|
"linkDirectory": false,
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"@angular/forms": "^21.0.3",
|
|
13
13
|
"@angular/cdk": "^21.0.2",
|
|
14
14
|
"@ngxs/store": "^20.1.0",
|
|
15
|
-
"@masterteam/components": "^0.0.
|
|
15
|
+
"@masterteam/components": "^0.0.97",
|
|
16
16
|
"@masterteam/icons": "^0.0.13"
|
|
17
17
|
},
|
|
18
18
|
"exports": {
|
|
@@ -231,6 +231,10 @@ declare class Customization implements OnInit {
|
|
|
231
231
|
onEditProperty(prop: ManagePreviewPropertyItem): void;
|
|
232
232
|
onEntityResized(event: EntityResizeEvent): void;
|
|
233
233
|
onEntitiesReordered(entities: EntityData[]): void;
|
|
234
|
+
/**
|
|
235
|
+
* Save a property directly without opening the drawer (for viewTypes with no configurable fields).
|
|
236
|
+
*/
|
|
237
|
+
private saveDirectly;
|
|
234
238
|
/**
|
|
235
239
|
* Build bulk items from all current configurations, excluding a specific property.
|
|
236
240
|
* Then call bulk-replace so the backend replaces the entire context atomically.
|