@masterteam/customization 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
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-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}
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-auto{height:auto}.h-full{height:100%}.w-full{width:100%}.max-w-\[72rem\]{max-width:72rem}.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)}: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)}}@media (min-width:80rem){.xl\:h-full{height:100%}.xl\:w-1\/4{width:25%}.xl\:w-3\/4{width:75%}.xl\:flex-row{flex-direction:row}.xl\:gap-6{gap:calc(var(--spacing) * 6)}}@media (min-width:96rem){.\32 xl\:w-1\/5{width:20%}.\32 xl\:w-3\/5{width:60%}}}@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0), var(--p-enter-translate-y,0), 0) scale3d(var(--p-enter-scale,1), var(--p-enter-scale,1), var(--p-enter-scale,1)) rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0), var(--p-leave-translate-y,0), 0) scale3d(var(--p-leave-scale,1), var(--p-leave-scale,1), var(--p-leave-scale,1)) rotate(var(--p-leave-rotate,0))}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
@@ -1,5 +1,5 @@
1
1
  {
2
- "customization": {
2
+ "customization": {
3
3
  "title": "إدارة خصائص المعاينة",
4
4
  "attributes": "السمات",
5
5
  "search-properties": "البحث في الخصائص...",
@@ -1,5 +1,5 @@
1
1
  {
2
- "customization": {
2
+ "customization": {
3
3
  "title": "Manage Preview Properties",
4
4
  "attributes": "Attributes",
5
5
  "search-properties": "Search properties...",
@@ -161,7 +161,7 @@ let CustomizationState = class CustomizationState extends CrudStateBase {
161
161
  key: CustomizationActionKey.GetProperties,
162
162
  request$: req$,
163
163
  onSuccess: (response) => ({
164
- properties: response.data ?? [],
164
+ properties: (response.data?.properties ?? []).map(mapCatalogPropertyToManagePreview),
165
165
  }),
166
166
  });
167
167
  }
@@ -288,6 +288,21 @@ CustomizationState = __decorate([
288
288
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: CustomizationState, decorators: [{
289
289
  type: Injectable
290
290
  }], propDecorators: { getAreas: [], getProperties: [], getConfigurations: [], setModuleInfo: [], bulkReplaceConfigurations: [] } });
291
+ function mapCatalogPropertyToManagePreview(property) {
292
+ return {
293
+ id: property.id,
294
+ key: property.key,
295
+ normalizedKey: property.normalizedKey,
296
+ viewType: property.viewType,
297
+ viewTypeLabel: property.viewType,
298
+ name: { display: property.label },
299
+ order: property.order,
300
+ isRequired: property.isRequired,
301
+ isSystem: property.isSystem,
302
+ isCalculated: property.source?.toLowerCase().includes('calculated'),
303
+ configuration: property.configuration ?? undefined,
304
+ };
305
+ }
291
306
 
292
307
  class CustomizationFacade {
293
308
  store = inject(Store);
@@ -472,7 +487,7 @@ class Customization {
472
487
  return props.map((p) => ({ ...p, enabled: false }));
473
488
  return props.map((p) => ({
474
489
  ...p,
475
- enabled: configs.some((c) => c.areaKey === area && c.propertyKey === p.key),
490
+ enabled: configs.some((c) => c.areaKey === area && c.propertyKey === p.normalizedKey),
476
491
  }));
477
492
  }, ...(ngDevMode ? [{ debugName: "propertiesWithEnabled" }] : []));
478
493
  filteredProperties = computed(() => {
@@ -532,7 +547,7 @@ class Customization {
532
547
  }
533
548
  else {
534
549
  // Remove this property and bulk-replace with remaining checked props
535
- this.bulkSaveWithout(prop.key);
550
+ this.bulkSaveWithout(prop.normalizedKey);
536
551
  }
537
552
  }
538
553
  onEditProperty(prop) {
@@ -540,7 +555,7 @@ class Customization {
540
555
  if (!area)
541
556
  return;
542
557
  const configs = this.facade.configurations();
543
- const existingConfig = configs.find((c) => c.areaKey === area && c.propertyKey === prop.key);
558
+ const existingConfig = configs.find((c) => c.areaKey === area && c.propertyKey === prop.normalizedKey);
544
559
  this.openDrawer(prop, existingConfig);
545
560
  }
546
561
  onEntityResized(event) {
@@ -610,10 +625,10 @@ class Customization {
610
625
  });
611
626
  }
612
627
  // Add the new property
613
- if (!itemsMap.has(prop.key)) {
614
- itemsMap.set(prop.key, []);
628
+ if (!itemsMap.has(prop.normalizedKey)) {
629
+ itemsMap.set(prop.normalizedKey, []);
615
630
  }
616
- itemsMap.get(prop.key).push(newDisplayArea);
631
+ itemsMap.get(prop.normalizedKey).push(newDisplayArea);
617
632
  const items = Array.from(itemsMap.entries()).map(([propertyKey, displayAreas]) => ({ propertyKey, displayAreas }));
618
633
  this.facade.bulkReplaceConfigurations(items).subscribe();
619
634
  }
@@ -688,12 +703,13 @@ class Customization {
688
703
  this.modalService.openModal(PropertyConfigDrawer, 'drawer', {
689
704
  header: displayName,
690
705
  height: '25vw',
691
- styleClass: '!w-[27%] !absolute !shadow-none',
706
+ styleClass: '!absolute !shadow-none',
707
+ responsivePreset: 'drawer-narrow',
692
708
  position: 'end',
693
709
  appendTo: '#page-content',
694
710
  dismissible: true,
695
711
  inputValues: {
696
- propertyKey: prop.key,
712
+ propertyKey: prop.normalizedKey,
697
713
  propertyName: displayName,
698
714
  viewType: prop.viewType,
699
715
  areaKey: area,
@@ -703,7 +719,7 @@ class Customization {
703
719
  });
704
720
  }
705
721
  buildEntityFromConfig(config, props) {
706
- const prop = props.find((p) => p.key === config.propertyKey);
722
+ const prop = props.find((p) => p.normalizedKey === config.propertyKey);
707
723
  if (!prop)
708
724
  return null;
709
725
  const displayName = this.getPropertyDisplayName(prop);
@@ -711,7 +727,7 @@ class Customization {
711
727
  const entity = {
712
728
  id: prop.id,
713
729
  propertyId: prop.id,
714
- key: prop.key,
730
+ key: prop.normalizedKey,
715
731
  normalizedKey: prop.normalizedKey,
716
732
  name: displayName,
717
733
  value: this.getPlaceholderValue(viewType, displayName),
@@ -779,7 +795,7 @@ class Customization {
779
795
  }
780
796
  }
781
797
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: Customization, deps: [], target: i0.ɵɵFactoryTarget.Component });
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"] }] });
798
+ 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\r\n class=\"flex flex-col xl:flex-row gap-4 xl:gap-6 h-full w-full overflow-hidden\"\r\n >\r\n <!-- \u2500\u2500\u2500 Left Sidebar: Attributes Panel \u2500\u2500\u2500 -->\r\n <mt-card\r\n class=\"w-full xl:w-1/4 2xl:w-1/5 min-w-0 h-auto xl:h-full flex flex-col overflow-hidden pb-3\"\r\n >\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\r\n class=\"w-full xl:w-3/4 2xl:w-3/5 min-w-0 flex flex-col gap-4 h-full overflow-hidden items-center\"\r\n >\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-full max-w-[72rem] 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"] }] });
783
799
  }
784
800
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: Customization, decorators: [{
785
801
  type: Component,
@@ -794,7 +810,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
794
810
  Icon,
795
811
  Skeleton,
796
812
  EntitiesManage,
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"] }]
813
+ ], template: "<ng-container *transloco=\"let t; prefix: 'customization'\">\r\n <div\r\n class=\"flex flex-col xl:flex-row gap-4 xl:gap-6 h-full w-full overflow-hidden\"\r\n >\r\n <!-- \u2500\u2500\u2500 Left Sidebar: Attributes Panel \u2500\u2500\u2500 -->\r\n <mt-card\r\n class=\"w-full xl:w-1/4 2xl:w-1/5 min-w-0 h-auto xl:h-full flex flex-col overflow-hidden pb-3\"\r\n >\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\r\n class=\"w-full xl:w-3/4 2xl:w-3/5 min-w-0 flex flex-col gap-4 h-full overflow-hidden items-center\"\r\n >\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-full max-w-[72rem] 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"] }]
798
814
  }], ctorParameters: () => [] });
799
815
 
800
816
  /**
@@ -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 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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"}
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 {\r\n CatalogPropertyDto,\r\n DisplayArea,\r\n DisplayConfiguration,\r\n PropertyCatalogResponseDto,\r\n Response,\r\n} 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<PropertyCatalogResponseDto>>(\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?.properties ?? []).map(\r\n mapCatalogPropertyToManagePreview,\r\n ),\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\r\nfunction mapCatalogPropertyToManagePreview(\r\n property: CatalogPropertyDto,\r\n): ManagePreviewPropertyItem {\r\n return {\r\n id: property.id,\r\n key: property.key,\r\n normalizedKey: property.normalizedKey,\r\n viewType: property.viewType,\r\n viewTypeLabel: property.viewType,\r\n name: { display: property.label },\r\n order: property.order,\r\n isRequired: property.isRequired,\r\n isSystem: property.isSystem,\r\n isCalculated: property.source?.toLowerCase().includes('calculated'),\r\n configuration: property.configuration ?? undefined,\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.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 // 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.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.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.normalizedKey)) {\r\n itemsMap.set(prop.normalizedKey, []);\r\n }\r\n itemsMap.get(prop.normalizedKey)!.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: '!absolute !shadow-none',\r\n responsivePreset: 'drawer-narrow',\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.normalizedKey,\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\r\n class=\"flex flex-col xl:flex-row gap-4 xl:gap-6 h-full w-full overflow-hidden\"\r\n >\r\n <!-- ─── Left Sidebar: Attributes Panel ─── -->\r\n <mt-card\r\n class=\"w-full xl:w-1/4 2xl:w-1/5 min-w-0 h-auto xl:h-full flex flex-col overflow-hidden pb-3\"\r\n >\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\r\n class=\"w-full xl:w-3/4 2xl:w-3/5 min-w-0 flex flex-col gap-4 h-full overflow-hidden items-center\"\r\n >\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-full max-w-[72rem] 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",
3
+ "version": "0.0.5",
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.97",
15
+ "@masterteam/components": "^0.0.102",
16
16
  "@masterteam/icons": "^0.0.13"
17
17
  },
18
18
  "exports": {
@@ -17,6 +17,22 @@ interface Response<T> {
17
17
  data: T;
18
18
  cacheSession?: string;
19
19
  }
20
+ interface CatalogPropertyDto {
21
+ id: number;
22
+ key: string;
23
+ normalizedKey: string;
24
+ label: string;
25
+ viewType: string;
26
+ configuration: Record<string, unknown> | null;
27
+ source?: string;
28
+ order?: number;
29
+ isRequired?: boolean;
30
+ isSystem?: boolean;
31
+ }
32
+ interface PropertyCatalogResponseDto {
33
+ contextKey: string;
34
+ properties: CatalogPropertyDto[];
35
+ }
20
36
  interface DisplayArea {
21
37
  key: string;
22
38
  name: string;
@@ -125,7 +141,7 @@ declare class CustomizationState extends CrudStateBase<ManagePreviewPropertyItem
125
141
  static getLoadingActive(state: CustomizationStateModel): string[];
126
142
  static getErrors(state: CustomizationStateModel): Record<string, string | null>;
127
143
  getAreas(ctx: StateContext<CustomizationStateModel>): rxjs.Observable<Response<DisplayArea[]>>;
128
- getProperties(ctx: StateContext<CustomizationStateModel>, action: GetCustomization): rxjs.Observable<Response<ManagePreviewPropertyItem[]>>;
144
+ getProperties(ctx: StateContext<CustomizationStateModel>, action: GetCustomization): rxjs.Observable<Response<PropertyCatalogResponseDto>>;
129
145
  getConfigurations(ctx: StateContext<CustomizationStateModel>, action: GetManagePreviewConfigurations): rxjs.Observable<Response<DisplayConfiguration[]>>;
130
146
  setModuleInfo(ctx: StateContext<CustomizationStateModel>, action: SetManagePreviewModuleInfo): void;
131
147
  bulkReplaceConfigurations(ctx: StateContext<CustomizationStateModel>, action: BulkReplaceConfigurations): rxjs.Observable<Response<boolean>>;