@xsmusices/ui 1.41.0 → 1.42.0

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.
Files changed (167) hide show
  1. package/README.md +4 -18
  2. package/fesm2022/xsmusices-ui-country-flag.xsstory-BPTu5b4i.mjs +84 -0
  3. package/fesm2022/xsmusices-ui-country-flag.xsstory-BPTu5b4i.mjs.map +1 -0
  4. package/fesm2022/xsmusices-ui-country-name.xsstory-ENhKrPTw.mjs +106 -0
  5. package/fesm2022/xsmusices-ui-country-name.xsstory-ENhKrPTw.mjs.map +1 -0
  6. package/fesm2022/xsmusices-ui-date-chat.xsstory-BBAJebr1.mjs +75 -0
  7. package/fesm2022/xsmusices-ui-date-chat.xsstory-BBAJebr1.mjs.map +1 -0
  8. package/fesm2022/xsmusices-ui-date-format.xsstory-Chrcn1yu.mjs +69 -0
  9. package/fesm2022/xsmusices-ui-date-format.xsstory-Chrcn1yu.mjs.map +1 -0
  10. package/fesm2022/xsmusices-ui-date-long.xsstory-CkYL5e1z.mjs +67 -0
  11. package/fesm2022/xsmusices-ui-date-long.xsstory-CkYL5e1z.mjs.map +1 -0
  12. package/fesm2022/xsmusices-ui-first-letter-case.xsstory-BJDtnUwE.mjs +49 -0
  13. package/fesm2022/xsmusices-ui-first-letter-case.xsstory-BJDtnUwE.mjs.map +1 -0
  14. package/fesm2022/xsmusices-ui-import-media-bottom-bar.xsstory-7FhVkiVz.mjs +29 -0
  15. package/fesm2022/xsmusices-ui-import-media-bottom-bar.xsstory-7FhVkiVz.mjs.map +1 -0
  16. package/fesm2022/xsmusices-ui-import-media-card.xsstory-vhn8r2YJ.mjs +61 -0
  17. package/fesm2022/xsmusices-ui-import-media-card.xsstory-vhn8r2YJ.mjs.map +1 -0
  18. package/fesm2022/xsmusices-ui-import-media-flow.xsstory-CMVovyMA.mjs +122 -0
  19. package/fesm2022/xsmusices-ui-import-media-flow.xsstory-CMVovyMA.mjs.map +1 -0
  20. package/fesm2022/xsmusices-ui-import-media-header.xsstory-Ci82oaxD.mjs +37 -0
  21. package/fesm2022/xsmusices-ui-import-media-header.xsstory-Ci82oaxD.mjs.map +1 -0
  22. package/fesm2022/xsmusices-ui-index-DRXscULI.mjs +11161 -0
  23. package/fesm2022/xsmusices-ui-index-DRXscULI.mjs.map +1 -0
  24. package/fesm2022/xsmusices-ui-max-count.xsstory-kWzvhDsC.mjs +70 -0
  25. package/fesm2022/xsmusices-ui-max-count.xsstory-kWzvhDsC.mjs.map +1 -0
  26. package/fesm2022/xsmusices-ui-number-to-month.xsstory-LUhA1uRx.mjs +81 -0
  27. package/fesm2022/xsmusices-ui-number-to-month.xsstory-LUhA1uRx.mjs.map +1 -0
  28. package/fesm2022/xsmusices-ui-priorities.xsstory-3n93Ph84.mjs +92 -0
  29. package/fesm2022/xsmusices-ui-priorities.xsstory-3n93Ph84.mjs.map +1 -0
  30. package/fesm2022/xsmusices-ui-role.xsstory-Cz3SBwNU.mjs +76 -0
  31. package/fesm2022/xsmusices-ui-role.xsstory-Cz3SBwNU.mjs.map +1 -0
  32. package/fesm2022/xsmusices-ui-slice-array.xsstory-ElPwFlwd.mjs +76 -0
  33. package/fesm2022/xsmusices-ui-slice-array.xsstory-ElPwFlwd.mjs.map +1 -0
  34. package/fesm2022/xsmusices-ui-social.xsstory-gjFcbal_.mjs +83 -0
  35. package/fesm2022/xsmusices-ui-social.xsstory-gjFcbal_.mjs.map +1 -0
  36. package/fesm2022/xsmusices-ui-state-name.xsstory-kkdBe2V8.mjs +113 -0
  37. package/fesm2022/xsmusices-ui-state-name.xsstory-kkdBe2V8.mjs.map +1 -0
  38. package/fesm2022/xsmusices-ui-stats-card.xsstory-PWTUDysc.mjs +96 -0
  39. package/fesm2022/xsmusices-ui-stats-card.xsstory-PWTUDysc.mjs.map +1 -0
  40. package/fesm2022/xsmusices-ui-thousands-separator.xsstory-Q9Q7cCAG.mjs +49 -0
  41. package/fesm2022/xsmusices-ui-thousands-separator.xsstory-Q9Q7cCAG.mjs.map +1 -0
  42. package/fesm2022/xsmusices-ui-title-media.xsstory-C4qa-mT2.mjs +81 -0
  43. package/fesm2022/xsmusices-ui-title-media.xsstory-C4qa-mT2.mjs.map +1 -0
  44. package/fesm2022/xsmusices-ui-truncate-text.xsstory-B3RQ9xZ3.mjs +67 -0
  45. package/fesm2022/xsmusices-ui-truncate-text.xsstory-B3RQ9xZ3.mjs.map +1 -0
  46. package/fesm2022/xsmusices-ui-type-es.xsstory-BsE_4D9p.mjs +110 -0
  47. package/fesm2022/xsmusices-ui-type-es.xsstory-BsE_4D9p.mjs.map +1 -0
  48. package/fesm2022/xsmusices-ui-type-user.xsstory-Bn6Fnnmi.mjs +98 -0
  49. package/fesm2022/xsmusices-ui-type-user.xsstory-Bn6Fnnmi.mjs.map +1 -0
  50. package/fesm2022/xsmusices-ui-xs-action-sheet.xsstory-CBpZBlfx.mjs +402 -0
  51. package/fesm2022/xsmusices-ui-xs-action-sheet.xsstory-CBpZBlfx.mjs.map +1 -0
  52. package/fesm2022/xsmusices-ui-xs-alert-group.xsstory-HMGGLHfv.mjs +201 -0
  53. package/fesm2022/xsmusices-ui-xs-alert-group.xsstory-HMGGLHfv.mjs.map +1 -0
  54. package/fesm2022/xsmusices-ui-xs-alert.xsstory-CXTRbHHS.mjs +158 -0
  55. package/fesm2022/xsmusices-ui-xs-alert.xsstory-CXTRbHHS.mjs.map +1 -0
  56. package/fesm2022/xsmusices-ui-xs-auth.xsstory-DxO8iDpd.mjs +205 -0
  57. package/fesm2022/xsmusices-ui-xs-auth.xsstory-DxO8iDpd.mjs.map +1 -0
  58. package/fesm2022/xsmusices-ui-xs-badge.xsstory-B1QXLQ4H.mjs +229 -0
  59. package/fesm2022/xsmusices-ui-xs-badge.xsstory-B1QXLQ4H.mjs.map +1 -0
  60. package/fesm2022/xsmusices-ui-xs-block.xsstory-GXV6UFJo.mjs +165 -0
  61. package/fesm2022/xsmusices-ui-xs-block.xsstory-GXV6UFJo.mjs.map +1 -0
  62. package/fesm2022/xsmusices-ui-xs-breadcrumbs.xsstory-CNyBeURd.mjs +44 -0
  63. package/fesm2022/xsmusices-ui-xs-breadcrumbs.xsstory-CNyBeURd.mjs.map +1 -0
  64. package/fesm2022/xsmusices-ui-xs-button.xsstory-DqECZuZF.mjs +263 -0
  65. package/fesm2022/xsmusices-ui-xs-button.xsstory-DqECZuZF.mjs.map +1 -0
  66. package/fesm2022/xsmusices-ui-xs-buttons-group.xsstory-H1pcuFtx.mjs +97 -0
  67. package/fesm2022/xsmusices-ui-xs-buttons-group.xsstory-H1pcuFtx.mjs.map +1 -0
  68. package/fesm2022/xsmusices-ui-xs-chart.xsstory--iUHj7bv.mjs +239 -0
  69. package/fesm2022/xsmusices-ui-xs-chart.xsstory--iUHj7bv.mjs.map +1 -0
  70. package/fesm2022/xsmusices-ui-xs-chat-alert.xsstory-rdpQcMgJ.mjs +40 -0
  71. package/fesm2022/xsmusices-ui-xs-chat-alert.xsstory-rdpQcMgJ.mjs.map +1 -0
  72. package/fesm2022/xsmusices-ui-xs-chat-conversation-info.xsstory-BQjdjpbB.mjs +157 -0
  73. package/fesm2022/xsmusices-ui-xs-chat-conversation-info.xsstory-BQjdjpbB.mjs.map +1 -0
  74. package/fesm2022/xsmusices-ui-xs-chat-conversation.xsstory-sK9b5_Wo.mjs +303 -0
  75. package/fesm2022/xsmusices-ui-xs-chat-conversation.xsstory-sK9b5_Wo.mjs.map +1 -0
  76. package/fesm2022/xsmusices-ui-xs-chat-floating-panel.xsstory-_XfEzM1j.mjs +223 -0
  77. package/fesm2022/xsmusices-ui-xs-chat-floating-panel.xsstory-_XfEzM1j.mjs.map +1 -0
  78. package/fesm2022/xsmusices-ui-xs-chat-list.xsstory-BSY46FgK.mjs +46 -0
  79. package/fesm2022/xsmusices-ui-xs-chat-list.xsstory-BSY46FgK.mjs.map +1 -0
  80. package/fesm2022/xsmusices-ui-xs-chat-textarea.xsstory-NG2p0Tdw.mjs +35 -0
  81. package/fesm2022/xsmusices-ui-xs-chat-textarea.xsstory-NG2p0Tdw.mjs.map +1 -0
  82. package/fesm2022/xsmusices-ui-xs-customize-profile.xsstory-Ba7wmXF7.mjs +98 -0
  83. package/fesm2022/xsmusices-ui-xs-customize-profile.xsstory-Ba7wmXF7.mjs.map +1 -0
  84. package/fesm2022/xsmusices-ui-xs-date-mini.xsstory-DXog7Yhg.mjs +67 -0
  85. package/fesm2022/xsmusices-ui-xs-date-mini.xsstory-DXog7Yhg.mjs.map +1 -0
  86. package/fesm2022/xsmusices-ui-xs-date-range-picker.xsstory-Bmk2wv1s.mjs +25 -0
  87. package/fesm2022/xsmusices-ui-xs-date-range-picker.xsstory-Bmk2wv1s.mjs.map +1 -0
  88. package/fesm2022/xsmusices-ui-xs-empty-state.xsstory-CCOJ4b9_.mjs +70 -0
  89. package/fesm2022/xsmusices-ui-xs-empty-state.xsstory-CCOJ4b9_.mjs.map +1 -0
  90. package/fesm2022/xsmusices-ui-xs-filter-panel.xsstory-DbvxGppo.mjs +287 -0
  91. package/fesm2022/xsmusices-ui-xs-filter-panel.xsstory-DbvxGppo.mjs.map +1 -0
  92. package/fesm2022/xsmusices-ui-xs-formly.xsstory-Bjne7mpZ.mjs +3453 -0
  93. package/fesm2022/xsmusices-ui-xs-formly.xsstory-Bjne7mpZ.mjs.map +1 -0
  94. package/fesm2022/xsmusices-ui-xs-full-image.xsstory-xwN2jkW1.mjs +147 -0
  95. package/fesm2022/xsmusices-ui-xs-full-image.xsstory-xwN2jkW1.mjs.map +1 -0
  96. package/fesm2022/xsmusices-ui-xs-icon.xsstory-asFaHy5H.mjs +97 -0
  97. package/fesm2022/xsmusices-ui-xs-icon.xsstory-asFaHy5H.mjs.map +1 -0
  98. package/fesm2022/xsmusices-ui-xs-image.xsstory-BaeUg3Zp.mjs +142 -0
  99. package/fesm2022/xsmusices-ui-xs-image.xsstory-BaeUg3Zp.mjs.map +1 -0
  100. package/fesm2022/xsmusices-ui-xs-info-blocks.xsstory-BHtaC7U6.mjs +957 -0
  101. package/fesm2022/xsmusices-ui-xs-info-blocks.xsstory-BHtaC7U6.mjs.map +1 -0
  102. package/fesm2022/xsmusices-ui-xs-item-action.xsstory-839UkJyC.mjs +153 -0
  103. package/fesm2022/xsmusices-ui-xs-item-action.xsstory-839UkJyC.mjs.map +1 -0
  104. package/fesm2022/xsmusices-ui-xs-item-card.xsstory-EGJ6itkx.mjs +254 -0
  105. package/fesm2022/xsmusices-ui-xs-item-card.xsstory-EGJ6itkx.mjs.map +1 -0
  106. package/fesm2022/xsmusices-ui-xs-item-compact.xsstory-LhApuPL7.mjs +270 -0
  107. package/fesm2022/xsmusices-ui-xs-item-compact.xsstory-LhApuPL7.mjs.map +1 -0
  108. package/fesm2022/xsmusices-ui-xs-item-type.xsstory-DUeCnW0R.mjs +252 -0
  109. package/fesm2022/xsmusices-ui-xs-item-type.xsstory-DUeCnW0R.mjs.map +1 -0
  110. package/fesm2022/xsmusices-ui-xs-items-slider.xsstory-Dt0bXZI_.mjs +189 -0
  111. package/fesm2022/xsmusices-ui-xs-items-slider.xsstory-Dt0bXZI_.mjs.map +1 -0
  112. package/fesm2022/xsmusices-ui-xs-list.xsstory-lElGfvcY.mjs +633 -0
  113. package/fesm2022/xsmusices-ui-xs-list.xsstory-lElGfvcY.mjs.map +1 -0
  114. package/fesm2022/xsmusices-ui-xs-map.xsstory-C__bUaLQ.mjs +265 -0
  115. package/fesm2022/xsmusices-ui-xs-map.xsstory-C__bUaLQ.mjs.map +1 -0
  116. package/fesm2022/xsmusices-ui-xs-maplibre.xsstory-u_NroLqJ.mjs +513 -0
  117. package/fesm2022/xsmusices-ui-xs-maplibre.xsstory-u_NroLqJ.mjs.map +1 -0
  118. package/fesm2022/xsmusices-ui-xs-modal.xsstory-B96CYHF0.mjs +199 -0
  119. package/fesm2022/xsmusices-ui-xs-modal.xsstory-B96CYHF0.mjs.map +1 -0
  120. package/fesm2022/xsmusices-ui-xs-navbar-sidebar.xsstory-DHmPSARx.mjs +122 -0
  121. package/fesm2022/xsmusices-ui-xs-navbar-sidebar.xsstory-DHmPSARx.mjs.map +1 -0
  122. package/fesm2022/xsmusices-ui-xs-navbar.xsstory-DZrnLMId.mjs +203 -0
  123. package/fesm2022/xsmusices-ui-xs-navbar.xsstory-DZrnLMId.mjs.map +1 -0
  124. package/fesm2022/xsmusices-ui-xs-profile-comments.xsstory-CHpCDxLe.mjs +373 -0
  125. package/fesm2022/xsmusices-ui-xs-profile-comments.xsstory-CHpCDxLe.mjs.map +1 -0
  126. package/fesm2022/xsmusices-ui-xs-profile-current-event.xsstory-BtRq4wE4.mjs +111 -0
  127. package/fesm2022/xsmusices-ui-xs-profile-current-event.xsstory-BtRq4wE4.mjs.map +1 -0
  128. package/fesm2022/xsmusices-ui-xs-profile-exclusive.xsstory-B1Sag_X-.mjs +147 -0
  129. package/fesm2022/xsmusices-ui-xs-profile-exclusive.xsstory-B1Sag_X-.mjs.map +1 -0
  130. package/fesm2022/xsmusices-ui-xs-profile-image.xsstory-Cm_ixcdU.mjs +181 -0
  131. package/fesm2022/xsmusices-ui-xs-profile-image.xsstory-Cm_ixcdU.mjs.map +1 -0
  132. package/fesm2022/xsmusices-ui-xs-profile-info.xsstory-DAfsbXrF.mjs +95 -0
  133. package/fesm2022/xsmusices-ui-xs-profile-info.xsstory-DAfsbXrF.mjs.map +1 -0
  134. package/fesm2022/xsmusices-ui-xs-profile-random-flag.xsstory-DH3Y_XX1.mjs +50 -0
  135. package/fesm2022/xsmusices-ui-xs-profile-random-flag.xsstory-DH3Y_XX1.mjs.map +1 -0
  136. package/fesm2022/xsmusices-ui-xs-profile-skeleton.xsstory-BO0ZqUMS.mjs +66 -0
  137. package/fesm2022/xsmusices-ui-xs-profile-skeleton.xsstory-BO0ZqUMS.mjs.map +1 -0
  138. package/fesm2022/xsmusices-ui-xs-profile-tops.xsstory-eKxRAMdS.mjs +246 -0
  139. package/fesm2022/xsmusices-ui-xs-profile-tops.xsstory-eKxRAMdS.mjs.map +1 -0
  140. package/fesm2022/xsmusices-ui-xs-profile-verified.xsstory-HtbUlJFX.mjs +34 -0
  141. package/fesm2022/xsmusices-ui-xs-profile-verified.xsstory-HtbUlJFX.mjs.map +1 -0
  142. package/fesm2022/xsmusices-ui-xs-section-title.xsstory-CHlZ69FK.mjs +180 -0
  143. package/fesm2022/xsmusices-ui-xs-section-title.xsstory-CHlZ69FK.mjs.map +1 -0
  144. package/fesm2022/xsmusices-ui-xs-select-modal.xsstory-BMc6o0W7.mjs +112 -0
  145. package/fesm2022/xsmusices-ui-xs-select-modal.xsstory-BMc6o0W7.mjs.map +1 -0
  146. package/fesm2022/xsmusices-ui-xs-send-scraper.xsstory-Cq6PuwN7.mjs +79 -0
  147. package/fesm2022/xsmusices-ui-xs-send-scraper.xsstory-Cq6PuwN7.mjs.map +1 -0
  148. package/fesm2022/xsmusices-ui-xs-skeleton-for-slider.xsstory-k-uutKIV.mjs +67 -0
  149. package/fesm2022/xsmusices-ui-xs-skeleton-for-slider.xsstory-k-uutKIV.mjs.map +1 -0
  150. package/fesm2022/xsmusices-ui-xs-stepper.xsstory-gKU4wN-_.mjs +91 -0
  151. package/fesm2022/xsmusices-ui-xs-stepper.xsstory-gKU4wN-_.mjs.map +1 -0
  152. package/fesm2022/xsmusices-ui-xs-table-items.xsstory-vR5x6wZe.mjs +95 -0
  153. package/fesm2022/xsmusices-ui-xs-table-items.xsstory-vR5x6wZe.mjs.map +1 -0
  154. package/fesm2022/xsmusices-ui-xs-table.xsstory-s13JV3k9.mjs +2941 -0
  155. package/fesm2022/xsmusices-ui-xs-table.xsstory-s13JV3k9.mjs.map +1 -0
  156. package/fesm2022/xsmusices-ui-xs-tabs.xsstory-ColZVzXZ.mjs +72 -0
  157. package/fesm2022/xsmusices-ui-xs-tabs.xsstory-ColZVzXZ.mjs.map +1 -0
  158. package/fesm2022/xsmusices-ui-xs-title-collapse.xsstory-COqb1jdP.mjs +65 -0
  159. package/fesm2022/xsmusices-ui-xs-title-collapse.xsstory-COqb1jdP.mjs.map +1 -0
  160. package/fesm2022/xsmusices-ui-xs-toast.xsstory-BBhGu-j4.mjs +59 -0
  161. package/fesm2022/xsmusices-ui-xs-toast.xsstory-BBhGu-j4.mjs.map +1 -0
  162. package/fesm2022/xsmusices-ui.mjs +725 -684
  163. package/fesm2022/xsmusices-ui.mjs.map +1 -0
  164. package/index.d.ts +70 -83
  165. package/package.json +2 -22
  166. package/styles/shared-utilities.css +0 -1
  167. package/LICENSE +0 -9
@@ -0,0 +1,3453 @@
1
+ import { of } from 'rxjs';
2
+ import { XSFormlyComponent } from './xsmusices-ui.mjs';
3
+
4
+ const story = {
5
+ id: 'formly',
6
+ name: 'Formly',
7
+ type: 'component',
8
+ subtype: 'Base',
9
+ status: 'active',
10
+ usage: ['app', 'admin'],
11
+ updated: '2026-04-25T12:00:00.000Z',
12
+ created: '2026-04-23T00:00:00.000Z',
13
+ description: 'Wrapper base para usar Formly con componentes XS en la librería de UI.',
14
+ component: XSFormlyComponent,
15
+ notes: [
16
+ {
17
+ type: 'info',
18
+ date: '2026-04-25T12:00:00.000Z',
19
+ text: 'Los ejemplos de este story están basados en archivos reales de Formly de la app, no en demos ficticios.',
20
+ },
21
+ ],
22
+ selector: 'xs-formly',
23
+ multilanguage: true,
24
+ inputs: [
25
+ {
26
+ key: 'layout',
27
+ label: 'Layout del formulario',
28
+ type: 'text',
29
+ default: 'grid',
30
+ },
31
+ {
32
+ key: 'gridClass',
33
+ label: 'Clases de grid',
34
+ type: 'text',
35
+ default: 'grid w-full gap-4 grid-cols-1 lg:grid-cols-12',
36
+ },
37
+ {
38
+ key: 'fields',
39
+ label: 'Configuración de campos',
40
+ type: 'json',
41
+ default: [
42
+ {
43
+ key: 'name',
44
+ type: 'input',
45
+ props: {
46
+ label: 'Nombre',
47
+ placeholder: 'Introduce tu nombre',
48
+ required: true,
49
+ },
50
+ },
51
+ ],
52
+ },
53
+ {
54
+ key: 'model',
55
+ label: 'Modelo del formulario',
56
+ type: 'json',
57
+ default: {},
58
+ },
59
+ {
60
+ key: 'size',
61
+ label: 'Tamaño del formulario',
62
+ type: 'text',
63
+ default: 'normal',
64
+ },
65
+ ],
66
+ examples: [
67
+ {
68
+ name: '[APP] Onboarding',
69
+ description: 'Formulario de bienvenida usado para que los nuevos usuarios elijan su perfil y estilos.',
70
+ inputs: {
71
+ model: {
72
+ name: '',
73
+ type: '',
74
+ country: '',
75
+ region: '',
76
+ favoriteStyles: [],
77
+ },
78
+ fields: [
79
+ {
80
+ key: 'name',
81
+ type: 'input',
82
+ className: 'col-span-12 lg:col-span-6',
83
+ props: {
84
+ label: 'Nombre',
85
+ placeholder: 'Introduce tu nombre',
86
+ required: true,
87
+ },
88
+ },
89
+ {
90
+ key: 'type',
91
+ type: 'select-button',
92
+ className: 'col-span-12',
93
+ props: {
94
+ card: true,
95
+ required: true,
96
+ label: 'Tipo de usuario',
97
+ placeholder: 'Selecciona tu perfil',
98
+ options: [
99
+ {
100
+ label: 'Normal',
101
+ value: 'NORMAL',
102
+ image: '/assets/images/onboarding/user-normal.webp',
103
+ },
104
+ {
105
+ label: 'Artista',
106
+ value: 'ARTIST',
107
+ image: '/assets/images/onboarding/user-artist.webp',
108
+ },
109
+ {
110
+ label: 'Promotor',
111
+ value: 'PROMOTER',
112
+ image: '/assets/images/onboarding/user-promoter.webp',
113
+ },
114
+ {
115
+ label: 'Record Label',
116
+ value: 'RECORD_LABEL',
117
+ image: '/assets/images/onboarding/user-label.webp',
118
+ },
119
+ {
120
+ label: 'Site Manager',
121
+ value: 'SITE_MANAGER',
122
+ image: '/assets/images/onboarding/user-site.webp',
123
+ },
124
+ {
125
+ label: 'Manager',
126
+ value: 'MANAGER',
127
+ image: '/assets/images/onboarding/user-manager.webp',
128
+ },
129
+ ],
130
+ },
131
+ },
132
+ {
133
+ key: 'country',
134
+ type: 'select',
135
+ className: 'col-span-12 lg:col-span-4',
136
+ props: {
137
+ label: 'País',
138
+ placeholder: 'Selecciona país',
139
+ country: true,
140
+ hasSearch: true,
141
+ options: [
142
+ { code: 'ES', name: 'España', nameEn: 'Spain' },
143
+ {
144
+ code: 'DE',
145
+ name: 'Alemania',
146
+ nameEn: 'Germany',
147
+ },
148
+ {
149
+ code: 'FR',
150
+ name: 'Francia',
151
+ nameEn: 'France',
152
+ },
153
+ { code: 'IT', name: 'Italia', nameEn: 'Italy' },
154
+ {
155
+ code: 'UK',
156
+ name: 'Reino Unido',
157
+ nameEn: 'United Kingdom',
158
+ },
159
+ {
160
+ code: 'NL',
161
+ name: 'Países Bajos',
162
+ nameEn: 'Netherlands',
163
+ },
164
+ ],
165
+ },
166
+ },
167
+ {
168
+ key: 'region',
169
+ type: 'select',
170
+ className: 'col-span-12 lg:col-span-4',
171
+ props: {
172
+ label: 'Región',
173
+ placeholder: 'Selecciona región',
174
+ options: [
175
+ {
176
+ _id: 'berlin',
177
+ name: 'Berlín',
178
+ nameEn: 'Berlin',
179
+ },
180
+ {
181
+ _id: 'barcelona',
182
+ name: 'Barcelona',
183
+ nameEn: 'Barcelona',
184
+ },
185
+ {
186
+ _id: 'amsterdam',
187
+ name: 'Ámsterdam',
188
+ nameEn: 'Amsterdam',
189
+ },
190
+ {
191
+ _id: 'london',
192
+ name: 'Londres',
193
+ nameEn: 'London',
194
+ },
195
+ ],
196
+ },
197
+ hideExpression: '!model.country',
198
+ },
199
+ {
200
+ key: 'favoriteStyles',
201
+ type: 'select-button',
202
+ className: 'col-span-12',
203
+ props: {
204
+ required: false,
205
+ multi: true,
206
+ maxSelections: 5,
207
+ size: 'sm',
208
+ showMoreLimit: 12,
209
+ label: 'Estilos favoritos',
210
+ placeholder: 'Elige hasta 5 estilos para personalizar tu perfil',
211
+ options: [
212
+ { label: 'Techno', value: 'techno' },
213
+ { label: 'House', value: 'house' },
214
+ { label: 'Tech House', value: 'tech-house' },
215
+ { label: 'Minimal', value: 'minimal' },
216
+ { label: 'Hard Techno', value: 'hard-techno' },
217
+ { label: 'Deep House', value: 'deep-house' },
218
+ {
219
+ label: 'Melodic Techno',
220
+ value: 'melodic-techno',
221
+ },
222
+ { label: 'Acid', value: 'acid' },
223
+ { label: 'Disco', value: 'disco' },
224
+ { label: 'Trance', value: 'trance' },
225
+ { label: 'Indie Dance', value: 'indie-dance' },
226
+ { label: 'Hardstyle', value: 'hardstyle' },
227
+ { label: 'Ambient', value: 'ambient' },
228
+ { label: 'Progressive', value: 'progressive' },
229
+ {
230
+ label: 'Tech House Classics',
231
+ value: 'tech-house-classics',
232
+ },
233
+ {
234
+ label: 'Melodic House',
235
+ value: 'melodic-house',
236
+ },
237
+ ],
238
+ },
239
+ },
240
+ ],
241
+ },
242
+ },
243
+ {
244
+ name: '[APP] Login',
245
+ description: 'Formulario real de login usando el mismo layout y campos que se emplea en la app.',
246
+ inputs: {
247
+ fields: [
248
+ {
249
+ key: 'email',
250
+ type: 'input',
251
+ className: 'col-span-12',
252
+ props: {
253
+ label: 'Email',
254
+ placeholder: 'Introduce tu email',
255
+ type: 'email',
256
+ required: true,
257
+ },
258
+ },
259
+ {
260
+ key: 'password',
261
+ type: 'input',
262
+ className: 'col-span-12',
263
+ props: {
264
+ label: 'Contraseña',
265
+ placeholder: 'Introduce tu contraseña',
266
+ type: 'password',
267
+ required: true,
268
+ infoText: 'La contraseña debe tener al menos 8 caracteres, incluyendo mayúsculas, minúsculas y números.',
269
+ },
270
+ },
271
+ ],
272
+ },
273
+ },
274
+ {
275
+ name: '[APP] Registro',
276
+ description: 'Formulario real de registro con los campos usados en la app.',
277
+ inputs: {
278
+ fields: [
279
+ {
280
+ key: 'name',
281
+ type: 'input',
282
+ className: 'col-span-12',
283
+ props: {
284
+ label: 'Nombre',
285
+ placeholder: 'Introduce tu nombre',
286
+ required: true,
287
+ },
288
+ },
289
+ {
290
+ key: 'email',
291
+ type: 'input',
292
+ className: 'col-span-12',
293
+ props: {
294
+ label: 'Email',
295
+ placeholder: 'Introduce tu email',
296
+ type: 'email',
297
+ required: true,
298
+ },
299
+ },
300
+ {
301
+ key: 'password',
302
+ type: 'input',
303
+ className: 'col-span-12',
304
+ props: {
305
+ label: 'Contraseña',
306
+ placeholder: 'Introduce tu contraseña',
307
+ type: 'password',
308
+ required: true,
309
+ },
310
+ },
311
+ {
312
+ key: 'confirmPassword',
313
+ type: 'input',
314
+ className: 'col-span-12',
315
+ props: {
316
+ label: 'Confirmar contraseña',
317
+ placeholder: 'Repite tu contraseña',
318
+ type: 'password',
319
+ required: true,
320
+ },
321
+ validators: {
322
+ fieldMatch: {
323
+ expression: (control) => !control.value ||
324
+ control.value ===
325
+ control.parent?.get('password')?.value,
326
+ message: 'Las contraseñas no coinciden',
327
+ },
328
+ },
329
+ },
330
+ {
331
+ key: 'legal',
332
+ type: 'checkbox',
333
+ className: 'col-span-12',
334
+ props: {
335
+ required: true,
336
+ label: 'Acepto los Términos y Condiciones',
337
+ },
338
+ },
339
+ ],
340
+ },
341
+ },
342
+ {
343
+ name: '[APP] Recuperar contraseña',
344
+ description: 'Formulario real de recuperación con el campo de email usado en la app.',
345
+ inputs: {
346
+ fields: [
347
+ {
348
+ key: 'email',
349
+ type: 'input',
350
+ className: 'col-span-12',
351
+ props: {
352
+ label: 'Email',
353
+ placeholder: 'Introduce tu email',
354
+ type: 'email',
355
+ required: true,
356
+ },
357
+ },
358
+ ],
359
+ },
360
+ },
361
+ {
362
+ name: '[APP] Álbum (real)',
363
+ description: 'Formulario de creación de álbum con nombre, tipo, año, estilos y selector de tracks.',
364
+ inputs: {
365
+ layout: 'stack',
366
+ model: {
367
+ name: '',
368
+ type: 'album',
369
+ year: '',
370
+ styles: [],
371
+ items: [],
372
+ info: '',
373
+ },
374
+ fields: [
375
+ {
376
+ key: 'name',
377
+ type: 'input',
378
+ className: 'col-span-12 lg:col-span-6',
379
+ props: {
380
+ label: 'Nombre del álbum',
381
+ placeholder: 'Introduce nombre',
382
+ required: true,
383
+ },
384
+ },
385
+ {
386
+ key: 'type',
387
+ type: 'select',
388
+ defaultValue: 'album',
389
+ className: 'col-span-12 lg:col-span-3',
390
+ props: {
391
+ label: 'Tipo',
392
+ options: [
393
+ { label: 'Álbum', value: 'album' },
394
+ { label: 'LP', value: 'lp' },
395
+ ],
396
+ },
397
+ },
398
+ {
399
+ key: 'year',
400
+ type: 'input',
401
+ className: 'col-span-12 lg:col-span-3',
402
+ props: {
403
+ label: 'Año',
404
+ type: 'number',
405
+ placeholder: '2024',
406
+ },
407
+ },
408
+ {
409
+ key: 'styles',
410
+ type: 'select-button',
411
+ className: 'col-span-12',
412
+ props: {
413
+ options: [
414
+ { value: 'techno', label: 'Techno' },
415
+ { value: 'house', label: 'House' },
416
+ { value: 'deep-house', label: 'Deep House' },
417
+ { value: 'minimal', label: 'Minimal' },
418
+ { value: 'hard-techno', label: 'Hard Techno' },
419
+ ],
420
+ multi: true,
421
+ maxSelections: 5,
422
+ size: 'sm',
423
+ showMoreLimit: 12,
424
+ label: 'Estilos',
425
+ placeholder: 'Selecciona estilos',
426
+ },
427
+ },
428
+ {
429
+ key: 'items',
430
+ type: 'entity-picker',
431
+ className: 'col-span-12',
432
+ props: {
433
+ label: 'Tracks del álbum',
434
+ typeItem: 'media',
435
+ iconFallback: 'music',
436
+ formatSecondary: (item) => {
437
+ const artists = item['artists'];
438
+ if (!artists?.length)
439
+ return '';
440
+ const first = String(artists[0]['name'] ?? '');
441
+ const rest = artists.length - 1;
442
+ return rest > 0 ? `${first} +${rest}` : first;
443
+ },
444
+ onSearch: async (query) => {
445
+ const allTracks = [
446
+ {
447
+ _id: '1',
448
+ name: 'Track Uno',
449
+ image: true,
450
+ artists: [{ name: 'Artista A' }],
451
+ },
452
+ {
453
+ _id: '2',
454
+ name: 'Track Dos',
455
+ image: true,
456
+ artists: [{ name: 'Artista B' }],
457
+ },
458
+ {
459
+ _id: '3',
460
+ name: 'Track Tres',
461
+ artists: [
462
+ { name: 'Artista A' },
463
+ { name: 'Artista C' },
464
+ ],
465
+ },
466
+ {
467
+ _id: '4',
468
+ name: 'Otro Track',
469
+ artists: [{ name: 'Artista D' }],
470
+ },
471
+ ];
472
+ return allTracks.filter((t) => t.name
473
+ .toLowerCase()
474
+ .includes(query.toLowerCase()));
475
+ },
476
+ },
477
+ },
478
+ {
479
+ key: 'info',
480
+ type: 'html-editor',
481
+ className: 'col-span-12',
482
+ props: {
483
+ label: 'Información',
484
+ placeholder: 'Describe el álbum',
485
+ },
486
+ },
487
+ ],
488
+ },
489
+ },
490
+ {
491
+ name: '[APP] Enviar artista',
492
+ description: 'Formulario de envío de artista con nombre, país, residencia, estilos, imagen, redes e info.',
493
+ inputs: {
494
+ layout: 'stack',
495
+ model: {
496
+ name: '',
497
+ country: '',
498
+ countryResidence: '',
499
+ styles: [],
500
+ imageUpload: '',
501
+ social: {
502
+ soundcloud: '',
503
+ instagram: '',
504
+ twitter: '',
505
+ web: '',
506
+ },
507
+ info: '',
508
+ },
509
+ fields: [
510
+ {
511
+ key: 'name',
512
+ type: 'input',
513
+ className: 'col-span-12 lg:col-span-6',
514
+ props: {
515
+ label: 'Nombre',
516
+ placeholder: 'Introduce nombre',
517
+ required: true,
518
+ },
519
+ },
520
+ {
521
+ key: 'country',
522
+ type: 'select',
523
+ className: 'col-span-12 lg:col-span-4',
524
+ props: {
525
+ label: 'País',
526
+ placeholder: 'Selecciona país',
527
+ country: true,
528
+ hasSearch: true,
529
+ options: [
530
+ {
531
+ _id: 'es',
532
+ name: 'España',
533
+ nameEn: 'Spain',
534
+ code: 'ES',
535
+ },
536
+ {
537
+ _id: 'de',
538
+ name: 'Alemania',
539
+ nameEn: 'Germany',
540
+ code: 'DE',
541
+ },
542
+ {
543
+ _id: 'fr',
544
+ name: 'Francia',
545
+ nameEn: 'France',
546
+ code: 'FR',
547
+ },
548
+ {
549
+ _id: 'it',
550
+ name: 'Italia',
551
+ nameEn: 'Italy',
552
+ code: 'IT',
553
+ },
554
+ ],
555
+ },
556
+ },
557
+ {
558
+ key: 'countryResidence',
559
+ type: 'select',
560
+ className: 'col-span-12 lg:col-span-4',
561
+ props: {
562
+ label: 'País de residencia',
563
+ placeholder: 'Selecciona país',
564
+ country: true,
565
+ hasSearch: true,
566
+ options: [
567
+ {
568
+ _id: 'es',
569
+ name: 'España',
570
+ nameEn: 'Spain',
571
+ code: 'ES',
572
+ },
573
+ {
574
+ _id: 'de',
575
+ name: 'Alemania',
576
+ nameEn: 'Germany',
577
+ code: 'DE',
578
+ },
579
+ {
580
+ _id: 'fr',
581
+ name: 'Francia',
582
+ nameEn: 'France',
583
+ code: 'FR',
584
+ },
585
+ ],
586
+ },
587
+ },
588
+ {
589
+ key: 'styles',
590
+ type: 'select-button',
591
+ className: 'col-span-12',
592
+ props: {
593
+ options: [
594
+ { value: 'techno', label: 'Techno' },
595
+ { value: 'house', label: 'House' },
596
+ { value: 'deep-house', label: 'Deep House' },
597
+ { value: 'minimal', label: 'Minimal' },
598
+ ],
599
+ multi: true,
600
+ maxSelections: 5,
601
+ size: 'sm',
602
+ showMoreLimit: 12,
603
+ label: 'Estilos',
604
+ placeholder: 'Selecciona estilos',
605
+ },
606
+ },
607
+ {
608
+ key: 'imageUpload',
609
+ type: 'upload-image',
610
+ className: 'col-span-12',
611
+ props: { label: 'Imagen', required: true },
612
+ },
613
+ {
614
+ key: 'social',
615
+ type: 'social',
616
+ className: 'col-span-12',
617
+ props: { label: 'Redes sociales' },
618
+ },
619
+ {
620
+ key: 'info',
621
+ type: 'html-editor',
622
+ className: 'col-span-12',
623
+ props: {
624
+ label: 'Información',
625
+ placeholder: 'Introduce información',
626
+ },
627
+ },
628
+ ],
629
+ },
630
+ },
631
+ {
632
+ name: '[APP] Enviar evento',
633
+ description: 'Formulario de envío de evento con nombre, estilos, fechas, imagen, sitio, artistas e info.',
634
+ inputs: {
635
+ layout: 'stack',
636
+ model: {
637
+ name: '',
638
+ styles: [],
639
+ date: '',
640
+ dateEnd: '',
641
+ imageUpload: '',
642
+ site: '',
643
+ artists: [],
644
+ info: '',
645
+ },
646
+ fields: [
647
+ {
648
+ key: 'name',
649
+ type: 'input',
650
+ className: 'col-span-12 lg:col-span-6',
651
+ props: {
652
+ label: 'Nombre',
653
+ placeholder: 'Introduce nombre',
654
+ required: true,
655
+ },
656
+ },
657
+ {
658
+ key: 'styles',
659
+ type: 'select-button',
660
+ className: 'col-span-12 lg:col-span-6',
661
+ props: {
662
+ options: [
663
+ { value: 'techno', label: 'Techno' },
664
+ { value: 'house', label: 'House' },
665
+ ],
666
+ multi: true,
667
+ maxSelections: 5,
668
+ size: 'sm',
669
+ showMoreLimit: 12,
670
+ label: 'Estilos',
671
+ placeholder: 'Selecciona estilos',
672
+ },
673
+ },
674
+ {
675
+ key: 'date',
676
+ type: 'datetime',
677
+ className: 'col-span-12 lg:col-span-4',
678
+ props: {
679
+ label: 'Fecha inicio',
680
+ placeholder: 'Selecciona fecha',
681
+ required: true,
682
+ },
683
+ },
684
+ {
685
+ key: 'dateEnd',
686
+ type: 'datetime',
687
+ className: 'col-span-12 lg:col-span-4',
688
+ props: {
689
+ label: 'Fecha fin',
690
+ placeholder: 'Selecciona fecha',
691
+ },
692
+ },
693
+ {
694
+ key: 'imageUpload',
695
+ type: 'upload-image',
696
+ className: 'col-span-12',
697
+ props: { label: 'Imagen', required: true },
698
+ },
699
+ {
700
+ key: 'site',
701
+ type: 'select',
702
+ className: 'col-span-12 lg:col-span-6',
703
+ props: {
704
+ label: 'Sitio',
705
+ placeholder: 'Selecciona sitio',
706
+ subtype: 'site',
707
+ remoteSearch: true,
708
+ hasSearch: true,
709
+ onSearch: async (query) => {
710
+ const allSites = [
711
+ {
712
+ _id: 'site-1',
713
+ name: 'Club Alpha',
714
+ label: 'Club Alpha',
715
+ },
716
+ {
717
+ _id: 'site-2',
718
+ name: 'Festival Beta',
719
+ label: 'Festival Beta',
720
+ },
721
+ ];
722
+ return allSites.filter((s) => s.name
723
+ .toLowerCase()
724
+ .includes(query.toLowerCase()));
725
+ },
726
+ options: [
727
+ { _id: 'site-1', name: 'Club Alpha' },
728
+ { _id: 'site-2', name: 'Festival Beta' },
729
+ ],
730
+ },
731
+ },
732
+ {
733
+ key: 'artists',
734
+ type: 'select',
735
+ className: 'col-span-12 lg:col-span-6',
736
+ props: {
737
+ label: 'Artistas',
738
+ placeholder: 'Selecciona artistas',
739
+ subtype: 'artist',
740
+ remoteSearch: true,
741
+ multi: true,
742
+ hasSearch: true,
743
+ onSearch: async (query) => {
744
+ const allArtists = [
745
+ {
746
+ _id: 'artist-1',
747
+ name: 'Anna Melodia',
748
+ label: 'Anna Melodia',
749
+ },
750
+ {
751
+ _id: 'artist-2',
752
+ name: 'Duo Beats',
753
+ label: 'Duo Beats',
754
+ },
755
+ {
756
+ _id: 'artist-3',
757
+ name: 'Luna Nova',
758
+ label: 'Luna Nova',
759
+ },
760
+ ];
761
+ return allArtists.filter((a) => a.name
762
+ .toLowerCase()
763
+ .includes(query.toLowerCase()));
764
+ },
765
+ options: [
766
+ { _id: 'artist-1', name: 'Anna Melodia' },
767
+ { _id: 'artist-2', name: 'Duo Beats' },
768
+ ],
769
+ },
770
+ },
771
+ {
772
+ key: 'info',
773
+ type: 'html-editor',
774
+ className: 'col-span-12',
775
+ props: {
776
+ label: 'Información',
777
+ placeholder: 'Introduce información',
778
+ },
779
+ },
780
+ ],
781
+ },
782
+ },
783
+ {
784
+ name: '[APP] Enviar música',
785
+ description: 'Formulario de envío de música con nombre, tipo, artistas, sitio, año, estilos, enlaces e info.',
786
+ inputs: {
787
+ layout: 'stack',
788
+ model: {
789
+ name: '',
790
+ type: '',
791
+ artists: [],
792
+ site: '',
793
+ year: '',
794
+ styles: [],
795
+ sourceUrl: '',
796
+ freeDownloadLink: '',
797
+ buyLink: '',
798
+ info: '',
799
+ },
800
+ fields: [
801
+ {
802
+ key: 'name',
803
+ type: 'input',
804
+ className: 'col-span-12 lg:col-span-6',
805
+ props: {
806
+ label: 'Nombre',
807
+ placeholder: 'Introduce nombre',
808
+ required: true,
809
+ },
810
+ },
811
+ {
812
+ key: 'type',
813
+ type: 'select',
814
+ defaultValue: 'track',
815
+ className: 'col-span-12 lg:col-span-3',
816
+ props: {
817
+ label: 'Tipo',
818
+ options: [
819
+ { value: 'track', label: 'Track' },
820
+ { value: 'set', label: 'Set' },
821
+ { value: 'podcast', label: 'Podcast' },
822
+ { value: 'radioshow', label: 'Radioshow' },
823
+ ],
824
+ },
825
+ },
826
+ {
827
+ key: 'artists',
828
+ type: 'select',
829
+ className: 'col-span-12 lg:col-span-3',
830
+ props: {
831
+ label: 'Artistas',
832
+ subtype: 'artist',
833
+ remoteSearch: true,
834
+ multi: true,
835
+ hasSearch: true,
836
+ onSearch: async (query) => {
837
+ const allArtists = [
838
+ {
839
+ _id: 'artist-1',
840
+ name: 'Anna Melodia',
841
+ label: 'Anna Melodia',
842
+ },
843
+ {
844
+ _id: 'artist-2',
845
+ name: 'Duo Beats',
846
+ label: 'Duo Beats',
847
+ },
848
+ ];
849
+ return allArtists.filter((a) => a.name
850
+ .toLowerCase()
851
+ .includes(query.toLowerCase()));
852
+ },
853
+ options: [
854
+ { _id: 'artist-1', name: 'Anna Melodia' },
855
+ { _id: 'artist-2', name: 'Duo Beats' },
856
+ ],
857
+ },
858
+ },
859
+ {
860
+ key: 'site',
861
+ type: 'select',
862
+ className: 'col-span-12 lg:col-span-6',
863
+ props: {
864
+ label: 'Sitio',
865
+ subtype: 'site',
866
+ remoteSearch: true,
867
+ hasSearch: true,
868
+ onSearch: async (query) => {
869
+ const allSites = [
870
+ {
871
+ _id: 'site-1',
872
+ name: 'Club Alpha',
873
+ label: 'Club Alpha',
874
+ },
875
+ {
876
+ _id: 'site-2',
877
+ name: 'Festival Beta',
878
+ label: 'Festival Beta',
879
+ },
880
+ ];
881
+ return allSites.filter((s) => s.name
882
+ .toLowerCase()
883
+ .includes(query.toLowerCase()));
884
+ },
885
+ options: [
886
+ { _id: 'site-1', name: 'Club Alpha' },
887
+ { _id: 'site-2', name: 'Festival Beta' },
888
+ ],
889
+ },
890
+ },
891
+ {
892
+ key: 'year',
893
+ type: 'input',
894
+ className: 'col-span-12 lg:col-span-6',
895
+ props: {
896
+ label: 'Año',
897
+ type: 'number',
898
+ placeholder: '2024',
899
+ },
900
+ },
901
+ {
902
+ key: 'styles',
903
+ type: 'select-button',
904
+ className: 'col-span-12',
905
+ props: {
906
+ options: [
907
+ { value: 'techno', label: 'Techno' },
908
+ { value: 'house', label: 'House' },
909
+ ],
910
+ multi: true,
911
+ maxSelections: 5,
912
+ size: 'sm',
913
+ showMoreLimit: 12,
914
+ label: 'Estilos',
915
+ placeholder: 'Selecciona estilos',
916
+ },
917
+ },
918
+ {
919
+ key: 'sourceUrl',
920
+ type: 'input',
921
+ className: 'col-span-12 lg:col-span-4',
922
+ props: {
923
+ label: 'URL',
924
+ placeholder: 'URL de SoundCloud',
925
+ },
926
+ },
927
+ {
928
+ key: 'freeDownloadLink',
929
+ type: 'input',
930
+ className: 'col-span-12 lg:col-span-4',
931
+ props: {
932
+ label: 'Descarga gratuita',
933
+ placeholder: 'URL de descarga',
934
+ },
935
+ },
936
+ {
937
+ key: 'buyLink',
938
+ type: 'input',
939
+ className: 'col-span-12 lg:col-span-4',
940
+ props: {
941
+ label: 'Comprar',
942
+ placeholder: 'URL de compra',
943
+ },
944
+ },
945
+ {
946
+ key: 'info',
947
+ type: 'html-editor',
948
+ className: 'col-span-12',
949
+ props: {
950
+ label: 'Información',
951
+ placeholder: 'Introduce información',
952
+ },
953
+ },
954
+ ],
955
+ },
956
+ },
957
+ {
958
+ name: '[APP] Enviar organización',
959
+ description: 'Formulario de envío de organización con nombre, tipo, país, estilos, fundadores, artistas e info.',
960
+ inputs: {
961
+ layout: 'stack',
962
+ model: {
963
+ name: '',
964
+ type: '',
965
+ country: '',
966
+ styles: [],
967
+ founders: [],
968
+ artists: [],
969
+ info: '',
970
+ },
971
+ fields: [
972
+ {
973
+ key: 'name',
974
+ type: 'input',
975
+ className: 'col-span-12 lg:col-span-6',
976
+ props: {
977
+ label: 'Nombre',
978
+ placeholder: 'Introduce nombre',
979
+ required: true,
980
+ },
981
+ },
982
+ {
983
+ key: 'type',
984
+ type: 'select',
985
+ defaultValue: 'label',
986
+ className: 'col-span-12 lg:col-span-3',
987
+ props: {
988
+ label: 'Tipo',
989
+ hasImage: false,
990
+ options: [
991
+ { value: 'label', label: 'Label' },
992
+ { value: 'promoter', label: 'Promotor' },
993
+ { value: 'collective', label: 'Colectivo' },
994
+ { value: 'radioshow', label: 'Radioshow' },
995
+ ],
996
+ },
997
+ },
998
+ {
999
+ key: 'country',
1000
+ type: 'select',
1001
+ className: 'col-span-12 lg:col-span-4',
1002
+ props: {
1003
+ label: 'País',
1004
+ placeholder: 'Selecciona país',
1005
+ country: true,
1006
+ hasSearch: true,
1007
+ options: [
1008
+ {
1009
+ _id: 'es',
1010
+ name: 'España',
1011
+ nameEn: 'Spain',
1012
+ code: 'ES',
1013
+ },
1014
+ {
1015
+ _id: 'de',
1016
+ name: 'Alemania',
1017
+ nameEn: 'Germany',
1018
+ code: 'DE',
1019
+ },
1020
+ {
1021
+ _id: 'fr',
1022
+ name: 'Francia',
1023
+ nameEn: 'France',
1024
+ code: 'FR',
1025
+ },
1026
+ ],
1027
+ },
1028
+ },
1029
+ {
1030
+ key: 'styles',
1031
+ type: 'select-button',
1032
+ className: 'col-span-12 lg:col-span-6',
1033
+ props: {
1034
+ options: [
1035
+ { value: 'techno', label: 'Techno' },
1036
+ { value: 'house', label: 'House' },
1037
+ ],
1038
+ multi: true,
1039
+ maxSelections: 5,
1040
+ size: 'sm',
1041
+ showMoreLimit: 12,
1042
+ label: 'Estilos',
1043
+ placeholder: 'Selecciona estilos',
1044
+ },
1045
+ },
1046
+ {
1047
+ key: 'founders',
1048
+ type: 'select',
1049
+ className: 'col-span-12 lg:col-span-6',
1050
+ props: {
1051
+ label: 'Fundadores',
1052
+ subtype: 'artist',
1053
+ remoteSearch: true,
1054
+ multi: true,
1055
+ hasSearch: true,
1056
+ placeholder: 'Selecciona fundadores',
1057
+ onSearch: async (query) => {
1058
+ const allArtists = [
1059
+ {
1060
+ _id: 'artist-1',
1061
+ name: 'Anna Melodia',
1062
+ label: 'Anna Melodia',
1063
+ },
1064
+ {
1065
+ _id: 'artist-2',
1066
+ name: 'Duo Beats',
1067
+ label: 'Duo Beats',
1068
+ },
1069
+ ];
1070
+ return allArtists.filter((a) => a.name
1071
+ .toLowerCase()
1072
+ .includes(query.toLowerCase()));
1073
+ },
1074
+ options: [
1075
+ { _id: 'artist-1', name: 'Anna Melodia' },
1076
+ { _id: 'artist-2', name: 'Duo Beats' },
1077
+ ],
1078
+ },
1079
+ },
1080
+ {
1081
+ key: 'artists',
1082
+ type: 'select',
1083
+ className: 'col-span-12 lg:col-span-6',
1084
+ props: {
1085
+ label: 'Artistas',
1086
+ subtype: 'artist',
1087
+ remoteSearch: true,
1088
+ multi: true,
1089
+ hasSearch: true,
1090
+ placeholder: 'Selecciona artistas',
1091
+ onSearch: async (query) => {
1092
+ const allArtists = [
1093
+ {
1094
+ _id: 'artist-1',
1095
+ name: 'Anna Melodia',
1096
+ label: 'Anna Melodia',
1097
+ },
1098
+ {
1099
+ _id: 'artist-2',
1100
+ name: 'Duo Beats',
1101
+ label: 'Duo Beats',
1102
+ },
1103
+ {
1104
+ _id: 'artist-3',
1105
+ name: 'Luna Nova',
1106
+ label: 'Luna Nova',
1107
+ },
1108
+ ];
1109
+ return allArtists.filter((a) => a.name
1110
+ .toLowerCase()
1111
+ .includes(query.toLowerCase()));
1112
+ },
1113
+ options: [
1114
+ { _id: 'artist-1', name: 'Anna Melodia' },
1115
+ { _id: 'artist-2', name: 'Duo Beats' },
1116
+ ],
1117
+ },
1118
+ },
1119
+ {
1120
+ key: 'info',
1121
+ type: 'html-editor',
1122
+ className: 'col-span-12',
1123
+ props: {
1124
+ label: 'Información',
1125
+ placeholder: 'Introduce información',
1126
+ },
1127
+ },
1128
+ ],
1129
+ },
1130
+ },
1131
+ {
1132
+ name: '[APP] Enviar sitio',
1133
+ description: 'Formulario de envío de sitio con nombre, tipo, dirección, coordenadas, estilos, capacidad, redes e info.',
1134
+ inputs: {
1135
+ layout: 'stack',
1136
+ model: {
1137
+ name: '',
1138
+ type: '',
1139
+ address: {
1140
+ street: '',
1141
+ town: '',
1142
+ country: '',
1143
+ region: '',
1144
+ coordinates: [],
1145
+ },
1146
+ styles: [],
1147
+ capacity: '',
1148
+ social: {
1149
+ soundcloud: '',
1150
+ instagram: '',
1151
+ twitter: '',
1152
+ website: '',
1153
+ },
1154
+ info: '',
1155
+ },
1156
+ fields: [
1157
+ {
1158
+ key: 'name',
1159
+ type: 'input',
1160
+ className: 'col-span-12 lg:col-span-6',
1161
+ props: {
1162
+ label: 'Nombre',
1163
+ placeholder: 'Introduce nombre',
1164
+ required: true,
1165
+ },
1166
+ },
1167
+ {
1168
+ key: 'type',
1169
+ type: 'select',
1170
+ className: 'col-span-12 lg:col-span-6',
1171
+ props: {
1172
+ label: 'Tipo de sitio',
1173
+ options: [
1174
+ { value: 'club', label: 'Club' },
1175
+ { value: 'festival', label: 'Festival' },
1176
+ { value: 'bar', label: 'Bar' },
1177
+ ],
1178
+ required: true,
1179
+ },
1180
+ },
1181
+ {
1182
+ key: 'address',
1183
+ type: 'address-search',
1184
+ className: 'col-span-12',
1185
+ props: {
1186
+ label: 'Dirección',
1187
+ placeholder: 'Buscar dirección...',
1188
+ required: true,
1189
+ countries: [
1190
+ { _id: 'es', name: 'España', code: 'ES' },
1191
+ { _id: 'de', name: 'Alemania', code: 'DE' },
1192
+ { _id: 'fr', name: 'Francia', code: 'FR' },
1193
+ { _id: 'it', name: 'Italia', code: 'IT' },
1194
+ ],
1195
+ searchFn: (q) => {
1196
+ const all = [
1197
+ {
1198
+ label: 'Calle Gran Vía 1, Madrid, España',
1199
+ street: 'Calle Gran Vía 1',
1200
+ town: 'Madrid',
1201
+ countryCode: 'es',
1202
+ lat: 40.4168,
1203
+ lng: -3.7038,
1204
+ },
1205
+ {
1206
+ label: 'Calle Serrano 10, Madrid, España',
1207
+ street: 'Calle Serrano 10',
1208
+ town: 'Madrid',
1209
+ countryCode: 'es',
1210
+ lat: 40.4278,
1211
+ lng: -3.6863,
1212
+ },
1213
+ {
1214
+ label: 'Paseo de Gracia 20, Barcelona, España',
1215
+ street: 'Paseo de Gracia 20',
1216
+ town: 'Barcelona',
1217
+ countryCode: 'es',
1218
+ lat: 41.3874,
1219
+ lng: 2.1686,
1220
+ },
1221
+ {
1222
+ label: 'Alexanderplatz 1, Berlín, Alemania',
1223
+ street: 'Alexanderplatz 1',
1224
+ town: 'Berlín',
1225
+ countryCode: 'de',
1226
+ lat: 52.52,
1227
+ lng: 13.405,
1228
+ },
1229
+ ];
1230
+ return of(all.filter((s) => s.label
1231
+ .toLowerCase()
1232
+ .includes(q.toLowerCase())));
1233
+ },
1234
+ geocodeFn: (addr) => of({
1235
+ street: addr.split(',')[0] || '',
1236
+ town: 'Madrid',
1237
+ region: {
1238
+ _id: 'region-1',
1239
+ name: 'Comunidad de Madrid',
1240
+ country: 'es',
1241
+ },
1242
+ country: {
1243
+ _id: 'es',
1244
+ name: 'España',
1245
+ code: 'ES',
1246
+ },
1247
+ coordinates: [-3.7038, 40.4168],
1248
+ }),
1249
+ },
1250
+ },
1251
+ {
1252
+ key: 'styles',
1253
+ type: 'select-button',
1254
+ className: 'col-span-12',
1255
+ props: {
1256
+ options: [
1257
+ { value: 'techno', label: 'Techno' },
1258
+ { value: 'house', label: 'House' },
1259
+ ],
1260
+ multi: true,
1261
+ maxSelections: 5,
1262
+ size: 'sm',
1263
+ showMoreLimit: 12,
1264
+ label: 'Estilos musicales',
1265
+ placeholder: 'Selecciona estilos',
1266
+ },
1267
+ },
1268
+ {
1269
+ key: 'capacity',
1270
+ type: 'input',
1271
+ className: 'col-span-12 lg:col-span-6',
1272
+ props: {
1273
+ label: 'Capacidad',
1274
+ type: 'number',
1275
+ placeholder: 'Introduce capacidad',
1276
+ },
1277
+ },
1278
+ {
1279
+ key: 'social.soundcloud',
1280
+ type: 'input',
1281
+ className: 'col-span-12 lg:col-span-6',
1282
+ props: {
1283
+ label: 'SoundCloud',
1284
+ placeholder: 'URL de SoundCloud',
1285
+ },
1286
+ },
1287
+ {
1288
+ key: 'social.instagram',
1289
+ type: 'input',
1290
+ className: 'col-span-12 lg:col-span-6',
1291
+ props: {
1292
+ label: 'Instagram',
1293
+ placeholder: 'Usuario de Instagram',
1294
+ },
1295
+ },
1296
+ {
1297
+ key: 'social.twitter',
1298
+ type: 'input',
1299
+ className: 'col-span-12 lg:col-span-6',
1300
+ props: {
1301
+ label: 'Twitter/X',
1302
+ placeholder: 'Usuario de Twitter/X',
1303
+ },
1304
+ },
1305
+ {
1306
+ key: 'social.website',
1307
+ type: 'input',
1308
+ className: 'col-span-12 lg:col-span-6',
1309
+ props: {
1310
+ label: 'Website',
1311
+ placeholder: 'URL del sitio web',
1312
+ },
1313
+ },
1314
+ {
1315
+ key: 'info',
1316
+ type: 'html-editor',
1317
+ className: 'col-span-12',
1318
+ props: {
1319
+ label: 'Información',
1320
+ placeholder: 'Introduce información',
1321
+ },
1322
+ },
1323
+ ],
1324
+ },
1325
+ },
1326
+ {
1327
+ name: '[APP] Enviar playlist',
1328
+ description: 'Formulario de envío de playlist con nombre, estilos, artistas, sitio, año, URL, selector de tracks e info.',
1329
+ inputs: {
1330
+ layout: 'stack',
1331
+ model: {
1332
+ name: '',
1333
+ styles: [],
1334
+ artists: [],
1335
+ site: '',
1336
+ year: '',
1337
+ sourceUrl: '',
1338
+ items: [],
1339
+ info: '',
1340
+ },
1341
+ fields: [
1342
+ {
1343
+ key: 'name',
1344
+ type: 'input',
1345
+ className: 'col-span-12 lg:col-span-6',
1346
+ props: {
1347
+ label: 'Nombre',
1348
+ placeholder: 'Introduce nombre',
1349
+ required: true,
1350
+ },
1351
+ },
1352
+ {
1353
+ key: 'styles',
1354
+ type: 'select-button',
1355
+ className: 'col-span-12',
1356
+ props: {
1357
+ options: [
1358
+ { value: 'techno', label: 'Techno' },
1359
+ { value: 'house', label: 'House' },
1360
+ ],
1361
+ multi: true,
1362
+ maxSelections: 5,
1363
+ size: 'sm',
1364
+ showMoreLimit: 12,
1365
+ label: 'Estilos musicales',
1366
+ placeholder: 'Selecciona estilos',
1367
+ },
1368
+ },
1369
+ {
1370
+ key: 'artists',
1371
+ type: 'select',
1372
+ className: 'col-span-12',
1373
+ props: {
1374
+ label: 'Artistas',
1375
+ multiple: true,
1376
+ options: [
1377
+ { _id: 'artist-1', name: 'Anna Melodia' },
1378
+ { _id: 'artist-2', name: 'Duo Beats' },
1379
+ ],
1380
+ },
1381
+ },
1382
+ {
1383
+ key: 'site',
1384
+ type: 'select',
1385
+ className: 'col-span-12 lg:col-span-6',
1386
+ props: {
1387
+ label: 'Sitio',
1388
+ options: [
1389
+ { _id: 'site-1', name: 'Club Alpha' },
1390
+ { _id: 'site-2', name: 'Festival Beta' },
1391
+ ],
1392
+ },
1393
+ },
1394
+ {
1395
+ key: 'year',
1396
+ type: 'input',
1397
+ className: 'col-span-12 lg:col-span-6',
1398
+ props: {
1399
+ label: 'Año',
1400
+ type: 'number',
1401
+ placeholder: 'Año de creación',
1402
+ },
1403
+ },
1404
+ {
1405
+ key: 'sourceUrl',
1406
+ type: 'input',
1407
+ className: 'col-span-12',
1408
+ props: {
1409
+ label: 'URL de la playlist',
1410
+ placeholder: 'Introduce URL',
1411
+ },
1412
+ },
1413
+ {
1414
+ key: 'items',
1415
+ type: 'entity-picker',
1416
+ className: 'col-span-12',
1417
+ props: {
1418
+ label: 'Tracks de la playlist',
1419
+ typeItem: 'media',
1420
+ iconFallback: 'music',
1421
+ formatSecondary: (item) => {
1422
+ const artists = item['artists'];
1423
+ if (!artists?.length)
1424
+ return '';
1425
+ const first = String(artists[0]['name'] ?? '');
1426
+ const rest = artists.length - 1;
1427
+ return rest > 0 ? `${first} +${rest}` : first;
1428
+ },
1429
+ onSearch: async (query) => {
1430
+ const tracks = [
1431
+ {
1432
+ _id: '1',
1433
+ name: 'Track Uno',
1434
+ image: true,
1435
+ artists: [{ name: 'Artista A' }],
1436
+ },
1437
+ {
1438
+ _id: '2',
1439
+ name: 'Track Dos',
1440
+ image: true,
1441
+ artists: [{ name: 'Artista B' }],
1442
+ },
1443
+ {
1444
+ _id: '3',
1445
+ name: 'Track Tres',
1446
+ artists: [
1447
+ { name: 'Artista A' },
1448
+ { name: 'Artista C' },
1449
+ ],
1450
+ },
1451
+ {
1452
+ _id: '4',
1453
+ name: 'Otro Track',
1454
+ artists: [{ name: 'Artista D' }],
1455
+ },
1456
+ {
1457
+ _id: '5',
1458
+ name: 'Melodic Track',
1459
+ image: true,
1460
+ artists: [{ name: 'Artista B' }],
1461
+ },
1462
+ {
1463
+ _id: '6',
1464
+ name: 'Deep Cut',
1465
+ artists: [{ name: 'Artista A' }],
1466
+ },
1467
+ ];
1468
+ return tracks.filter((t) => t.name
1469
+ .toLowerCase()
1470
+ .includes(query.toLowerCase()));
1471
+ },
1472
+ },
1473
+ },
1474
+ {
1475
+ key: 'info',
1476
+ type: 'html-editor',
1477
+ className: 'col-span-12',
1478
+ props: {
1479
+ label: 'Información',
1480
+ placeholder: 'Introduce información',
1481
+ },
1482
+ },
1483
+ ],
1484
+ },
1485
+ },
1486
+ {
1487
+ name: '[ADMIN] Playlist',
1488
+ description: 'Formulario de edición de playlist del panel de admin. Incluye campos ocultos, nombre, usuario, visibilidad, estado, selector de tracks, slug y slug anterior.',
1489
+ inputs: {
1490
+ layout: 'stack',
1491
+ model: {
1492
+ _id: '67ef1234abcd5678ef90abcd',
1493
+ name: 'Techno Selection 2026',
1494
+ user: { _id: 'user-1', name: 'annamelodia' },
1495
+ private: false,
1496
+ state: 'active',
1497
+ items: [
1498
+ {
1499
+ media: {
1500
+ _id: '1',
1501
+ name: 'Track Uno',
1502
+ image: true,
1503
+ artists: [{ name: 'Artista A' }],
1504
+ },
1505
+ position: 1,
1506
+ },
1507
+ {
1508
+ media: {
1509
+ _id: '3',
1510
+ name: 'Track Tres',
1511
+ artists: [
1512
+ { name: 'Artista A' },
1513
+ { name: 'Artista C' },
1514
+ ],
1515
+ },
1516
+ position: 2,
1517
+ },
1518
+ ],
1519
+ slug: 'techno-selection-2026',
1520
+ slugOld: 'techno-selection',
1521
+ },
1522
+ fields: [
1523
+ { key: '_id', type: 'hidden' },
1524
+ {
1525
+ key: 'name',
1526
+ type: 'input',
1527
+ className: 'col-span-12 lg:col-span-6',
1528
+ props: {
1529
+ label: 'Nombre',
1530
+ placeholder: 'Introduce nombre',
1531
+ required: true,
1532
+ },
1533
+ },
1534
+ {
1535
+ key: 'user',
1536
+ type: 'select',
1537
+ className: 'col-span-12 lg:col-span-6',
1538
+ props: {
1539
+ label: 'Usuario',
1540
+ placeholder: 'Introduce usuario',
1541
+ subtype: 'user',
1542
+ remoteSearch: true,
1543
+ options: [{ _id: 'user-1', name: 'annamelodia' }],
1544
+ },
1545
+ },
1546
+ {
1547
+ key: 'private',
1548
+ type: 'select',
1549
+ className: 'col-span-12 lg:col-span-6',
1550
+ props: {
1551
+ label: 'Lista privada',
1552
+ hasSearch: false,
1553
+ options: [
1554
+ { _id: true, name: 'Sí' },
1555
+ { _id: false, name: 'No' },
1556
+ ],
1557
+ },
1558
+ },
1559
+ {
1560
+ key: 'state',
1561
+ type: 'select',
1562
+ className: 'col-span-12 lg:col-span-6',
1563
+ props: {
1564
+ label: 'Estado',
1565
+ placeholder: 'Selecciona estado',
1566
+ required: true,
1567
+ options: [
1568
+ { _id: 'active', name: 'Activo' },
1569
+ { _id: 'inactive', name: 'Inactivo' },
1570
+ { _id: 'deleted', name: 'Eliminado' },
1571
+ ],
1572
+ },
1573
+ },
1574
+ {
1575
+ key: 'items',
1576
+ type: 'entity-picker',
1577
+ className: 'col-span-12',
1578
+ props: {
1579
+ label: 'Tracks de la playlist',
1580
+ typeItem: 'media',
1581
+ iconFallback: 'music',
1582
+ formatSecondary: (item) => {
1583
+ const artists = item['artists'];
1584
+ if (!artists?.length)
1585
+ return '';
1586
+ const first = String(artists[0]['name'] ?? '');
1587
+ const rest = artists.length - 1;
1588
+ return rest > 0 ? `${first} +${rest}` : first;
1589
+ },
1590
+ onSearch: async (query) => {
1591
+ const tracks = [
1592
+ {
1593
+ _id: '1',
1594
+ name: 'Track Uno',
1595
+ image: true,
1596
+ artists: [{ name: 'Artista A' }],
1597
+ },
1598
+ {
1599
+ _id: '2',
1600
+ name: 'Track Dos',
1601
+ image: true,
1602
+ artists: [{ name: 'Artista B' }],
1603
+ },
1604
+ {
1605
+ _id: '3',
1606
+ name: 'Track Tres',
1607
+ artists: [
1608
+ { name: 'Artista A' },
1609
+ { name: 'Artista C' },
1610
+ ],
1611
+ },
1612
+ {
1613
+ _id: '4',
1614
+ name: 'Otro Track',
1615
+ artists: [{ name: 'Artista D' }],
1616
+ },
1617
+ {
1618
+ _id: '5',
1619
+ name: 'Melodic Track',
1620
+ image: true,
1621
+ artists: [{ name: 'Artista B' }],
1622
+ },
1623
+ {
1624
+ _id: '6',
1625
+ name: 'Deep Cut',
1626
+ artists: [{ name: 'Artista A' }],
1627
+ },
1628
+ ];
1629
+ return tracks.filter((t) => t.name
1630
+ .toLowerCase()
1631
+ .includes(query.toLowerCase()));
1632
+ },
1633
+ },
1634
+ },
1635
+ {
1636
+ key: 'slug',
1637
+ type: 'input',
1638
+ className: 'col-span-12 lg:col-span-6',
1639
+ props: {
1640
+ label: 'Slug',
1641
+ placeholder: 'techno-selection-2026',
1642
+ readonly: true,
1643
+ },
1644
+ },
1645
+ {
1646
+ key: 'slugOld',
1647
+ type: 'input',
1648
+ className: 'col-span-12 lg:col-span-6',
1649
+ props: {
1650
+ label: 'Slug anterior',
1651
+ placeholder: 'techno-selection',
1652
+ readonly: true,
1653
+ },
1654
+ },
1655
+ ],
1656
+ },
1657
+ },
1658
+ {
1659
+ name: '[ADMIN] Artista',
1660
+ description: 'Formulario real de edición de artista del panel de admin. Incluye inputs, selects (país, estilos, estado), upload de imagen, redes sociales, textarea y datos simulados.',
1661
+ inputs: {
1662
+ layout: 'stack',
1663
+ fields: [
1664
+ { key: '_id', type: 'hidden' },
1665
+ {
1666
+ key: 'name',
1667
+ type: 'input',
1668
+ className: 'col-span-12 lg:col-span-6',
1669
+ props: {
1670
+ label: 'Nombre',
1671
+ placeholder: 'Introduce nombre',
1672
+ required: true,
1673
+ },
1674
+ },
1675
+ {
1676
+ key: 'country',
1677
+ type: 'select',
1678
+ className: 'col-span-12 lg:col-span-6',
1679
+ props: {
1680
+ label: 'País de nacimiento',
1681
+ placeholder: 'Selecciona un país',
1682
+ country: true,
1683
+ options: [
1684
+ { id: 'es', label: 'España', name: 'España' },
1685
+ {
1686
+ id: 'de',
1687
+ label: 'Alemania',
1688
+ name: 'Alemania',
1689
+ },
1690
+ { id: 'fr', label: 'Francia', name: 'Francia' },
1691
+ { id: 'it', label: 'Italia', name: 'Italia' },
1692
+ {
1693
+ id: 'nl',
1694
+ label: 'Países Bajos',
1695
+ name: 'Países Bajos',
1696
+ },
1697
+ ],
1698
+ },
1699
+ },
1700
+ {
1701
+ key: 'countryResidence',
1702
+ type: 'select',
1703
+ className: 'col-span-12 lg:col-span-6',
1704
+ props: {
1705
+ label: 'País de residencia',
1706
+ placeholder: 'Selecciona un país',
1707
+ country: true,
1708
+ options: [
1709
+ { id: 'es', label: 'España', name: 'España' },
1710
+ {
1711
+ id: 'de',
1712
+ label: 'Alemania',
1713
+ name: 'Alemania',
1714
+ },
1715
+ { id: 'fr', label: 'Francia', name: 'Francia' },
1716
+ ],
1717
+ },
1718
+ },
1719
+ {
1720
+ key: 'styles',
1721
+ type: 'select',
1722
+ className: 'col-span-12 lg:col-span-6',
1723
+ props: {
1724
+ label: 'Estilos',
1725
+ placeholder: 'Selecciona estilo/s',
1726
+ multi: true,
1727
+ maxSelections: 5,
1728
+ hasSearch: true,
1729
+ options: [
1730
+ {
1731
+ id: 'techno',
1732
+ label: 'Techno',
1733
+ name: 'Techno',
1734
+ },
1735
+ { id: 'house', label: 'House', name: 'House' },
1736
+ {
1737
+ id: 'deep-house',
1738
+ label: 'Deep House',
1739
+ name: 'Deep House',
1740
+ },
1741
+ {
1742
+ id: 'minimal',
1743
+ label: 'Minimal',
1744
+ name: 'Minimal',
1745
+ },
1746
+ {
1747
+ id: 'hard-techno',
1748
+ label: 'Hard Techno',
1749
+ name: 'Hard Techno',
1750
+ },
1751
+ { id: 'acid', label: 'Acid', name: 'Acid' },
1752
+ {
1753
+ id: 'trance',
1754
+ label: 'Trance',
1755
+ name: 'Trance',
1756
+ },
1757
+ ],
1758
+ },
1759
+ },
1760
+ {
1761
+ key: 'imageUpload',
1762
+ type: 'upload-image',
1763
+ className: 'col-span-12',
1764
+ props: {
1765
+ label: 'Imagen',
1766
+ placeholder: 'Selecciona una imagen',
1767
+ currentImageUrl: 'https://via.placeholder.com/400x400.png?text=Artista',
1768
+ },
1769
+ },
1770
+ {
1771
+ key: 'social',
1772
+ type: 'social',
1773
+ className: 'col-span-12',
1774
+ props: { label: 'Redes sociales', admin: true },
1775
+ },
1776
+ {
1777
+ key: 'user',
1778
+ type: 'select',
1779
+ className: 'col-span-12 lg:col-span-6',
1780
+ props: {
1781
+ label: 'Usuario',
1782
+ placeholder: 'Introduce usuario',
1783
+ subtype: 'user',
1784
+ remoteSearch: true,
1785
+ options: [
1786
+ {
1787
+ id: 'user-1',
1788
+ label: 'annamelodia',
1789
+ name: 'annamelodia',
1790
+ },
1791
+ ],
1792
+ },
1793
+ },
1794
+ {
1795
+ key: 'state',
1796
+ type: 'select',
1797
+ className: 'col-span-12 lg:col-span-6',
1798
+ props: {
1799
+ label: 'Estado',
1800
+ placeholder: 'Selecciona estado',
1801
+ required: true,
1802
+ options: [
1803
+ { _id: 'active', name: 'Activo' },
1804
+ { _id: 'inactive', name: 'Inactivo' },
1805
+ { _id: 'deleted', name: 'Eliminado' },
1806
+ ],
1807
+ },
1808
+ },
1809
+ {
1810
+ key: 'exclusive',
1811
+ type: 'select',
1812
+ className: 'col-span-12 lg:col-span-6',
1813
+ props: {
1814
+ label: 'Exclusivo',
1815
+ hasSearch: false,
1816
+ options: [
1817
+ { _id: true, name: 'Sí' },
1818
+ { _id: false, name: 'No' },
1819
+ ],
1820
+ },
1821
+ },
1822
+ {
1823
+ key: 'bannedTop',
1824
+ type: 'select',
1825
+ className: 'col-span-12 lg:col-span-6',
1826
+ props: {
1827
+ label: 'Baneado del top',
1828
+ hasSearch: false,
1829
+ options: [
1830
+ { _id: true, name: 'Sí' },
1831
+ { _id: false, name: 'No' },
1832
+ ],
1833
+ },
1834
+ },
1835
+ {
1836
+ key: 'bannedVisits',
1837
+ type: 'select',
1838
+ className: 'col-span-12 lg:col-span-6',
1839
+ props: {
1840
+ label: 'Baneado de visitas',
1841
+ hasSearch: false,
1842
+ options: [
1843
+ { _id: true, name: 'Sí' },
1844
+ { _id: false, name: 'No' },
1845
+ ],
1846
+ },
1847
+ },
1848
+ {
1849
+ key: 'slug',
1850
+ type: 'input',
1851
+ className: 'col-span-12 lg:col-span-6',
1852
+ props: {
1853
+ label: 'Slug',
1854
+ placeholder: 'anna-melodia',
1855
+ readonly: true,
1856
+ },
1857
+ },
1858
+ {
1859
+ key: 'slugOld',
1860
+ type: 'input',
1861
+ className: 'col-span-12 lg:col-span-6',
1862
+ props: {
1863
+ label: 'Slug anterior',
1864
+ placeholder: 'anna-melodia-old',
1865
+ readonly: true,
1866
+ },
1867
+ },
1868
+ {
1869
+ key: 'info',
1870
+ type: 'html-editor',
1871
+ className: 'col-span-12',
1872
+ props: {
1873
+ label: 'Información',
1874
+ placeholder: 'Describe al artista',
1875
+ },
1876
+ },
1877
+ {
1878
+ key: 'leadStatus',
1879
+ type: 'select',
1880
+ className: 'col-span-12',
1881
+ props: {
1882
+ label: 'Estado del lead',
1883
+ placeholder: 'Selecciona estado del lead',
1884
+ options: [
1885
+ { _id: 'new', name: 'Nuevo' },
1886
+ { _id: 'contacted', name: 'Contactado' },
1887
+ { _id: 'qualified', name: 'Calificado' },
1888
+ { _id: 'lost', name: 'Perdido' },
1889
+ ],
1890
+ },
1891
+ },
1892
+ {
1893
+ key: 'internalNotes',
1894
+ type: 'textarea',
1895
+ className: 'col-span-12',
1896
+ props: {
1897
+ label: 'Notas internas',
1898
+ placeholder: 'Introduce tus notas internas',
1899
+ rows: 4,
1900
+ },
1901
+ },
1902
+ ],
1903
+ model: {
1904
+ name: 'Anna Melodia',
1905
+ country: { id: 'es', name: 'España' },
1906
+ countryResidence: { id: 'de', name: 'Alemania' },
1907
+ styles: [
1908
+ { id: 'techno', name: 'Techno' },
1909
+ { id: 'house', name: 'House' },
1910
+ ],
1911
+ slug: 'anna-melodia',
1912
+ slugOld: 'anna-melodia-old',
1913
+ state: { _id: 'active', name: 'Activo' },
1914
+ exclusive: { _id: false, name: 'No' },
1915
+ bannedTop: { _id: false, name: 'No' },
1916
+ bannedVisits: { _id: false, name: 'No' },
1917
+ leadStatus: { _id: 'new', name: 'Nuevo' },
1918
+ info: 'DJ y productora de techno melódico afincada en Berlín. Ha publicado en labels como Afterlife, Innervisions y Diynamic.',
1919
+ },
1920
+ },
1921
+ },
1922
+ {
1923
+ name: '[ADMIN] Evento',
1924
+ description: 'Formulario real de edición de evento del panel de admin. Fechas, sitio remoto, artistas y más.',
1925
+ inputs: {
1926
+ layout: 'stack',
1927
+ fields: [
1928
+ { key: '_id', type: 'hidden' },
1929
+ {
1930
+ key: 'name',
1931
+ type: 'input',
1932
+ className: 'col-span-12 lg:col-span-6',
1933
+ props: {
1934
+ label: 'Nombre',
1935
+ placeholder: 'Introduce el nombre del evento',
1936
+ required: true,
1937
+ },
1938
+ },
1939
+ {
1940
+ key: 'styles',
1941
+ type: 'select',
1942
+ className: 'col-span-12 lg:col-span-6',
1943
+ props: {
1944
+ label: 'Estilos',
1945
+ placeholder: 'Selecciona los estilos',
1946
+ multi: true,
1947
+ maxSelections: 5,
1948
+ hasSearch: true,
1949
+ options: [
1950
+ {
1951
+ id: 'techno',
1952
+ label: 'Techno',
1953
+ name: 'Techno',
1954
+ },
1955
+ { id: 'house', label: 'House', name: 'House' },
1956
+ {
1957
+ id: 'hard-techno',
1958
+ label: 'Hard Techno',
1959
+ name: 'Hard Techno',
1960
+ },
1961
+ {
1962
+ id: 'melodic-techno',
1963
+ label: 'Melodic Techno',
1964
+ name: 'Melodic Techno',
1965
+ },
1966
+ ],
1967
+ },
1968
+ },
1969
+ {
1970
+ key: 'date',
1971
+ type: 'datetime',
1972
+ className: 'col-span-12 lg:col-span-6',
1973
+ props: { label: 'Fecha de inicio', required: true },
1974
+ },
1975
+ {
1976
+ key: 'dateEnd',
1977
+ type: 'datetime',
1978
+ className: 'col-span-12 lg:col-span-6',
1979
+ props: { label: 'Fecha de fin', required: true },
1980
+ },
1981
+ {
1982
+ key: 'site',
1983
+ type: 'select',
1984
+ className: 'col-span-12 lg:col-span-6',
1985
+ props: {
1986
+ label: 'Sitio',
1987
+ placeholder: 'Selecciona un sitio',
1988
+ subtype: 'site',
1989
+ remoteSearch: true,
1990
+ options: [
1991
+ {
1992
+ id: 'site-1',
1993
+ label: 'Club Alpha',
1994
+ name: 'Club Alpha',
1995
+ },
1996
+ {
1997
+ id: 'site-2',
1998
+ label: 'Festival Beta',
1999
+ name: 'Festival Beta',
2000
+ },
2001
+ ],
2002
+ },
2003
+ },
2004
+ {
2005
+ key: 'artists',
2006
+ type: 'select',
2007
+ className: 'col-span-12 lg:col-span-6',
2008
+ props: {
2009
+ label: 'Artistas',
2010
+ placeholder: 'Selecciona artistas',
2011
+ subtype: 'artist',
2012
+ remoteSearch: true,
2013
+ multi: true,
2014
+ options: [
2015
+ {
2016
+ id: 'artist-1',
2017
+ label: 'Anna Melodia',
2018
+ name: 'Anna Melodia',
2019
+ },
2020
+ {
2021
+ id: 'artist-2',
2022
+ label: 'Duo Beats',
2023
+ name: 'Duo Beats',
2024
+ },
2025
+ {
2026
+ id: 'artist-3',
2027
+ label: 'Luna Nova',
2028
+ name: 'Luna Nova',
2029
+ },
2030
+ ],
2031
+ },
2032
+ },
2033
+ {
2034
+ key: 'imageUpload',
2035
+ type: 'upload-image',
2036
+ className: 'col-span-12',
2037
+ props: {
2038
+ label: 'Imagen',
2039
+ placeholder: 'Selecciona una imagen',
2040
+ currentImageUrl: 'https://via.placeholder.com/800x400.png?text=Evento',
2041
+ },
2042
+ },
2043
+ {
2044
+ key: 'country',
2045
+ type: 'select',
2046
+ className: 'col-span-12 lg:col-span-6',
2047
+ props: {
2048
+ label: 'País',
2049
+ placeholder: 'Selecciona un país',
2050
+ country: true,
2051
+ options: [
2052
+ { id: 'es', label: 'España', name: 'España' },
2053
+ {
2054
+ id: 'de',
2055
+ label: 'Alemania',
2056
+ name: 'Alemania',
2057
+ },
2058
+ ],
2059
+ },
2060
+ },
2061
+ {
2062
+ key: 'region',
2063
+ type: 'select',
2064
+ className: 'col-span-12 lg:col-span-6',
2065
+ props: {
2066
+ label: 'Región',
2067
+ subtype: 'region',
2068
+ options: [
2069
+ { _id: 'berlin', name: 'Berlín' },
2070
+ { _id: 'barcelona', name: 'Barcelona' },
2071
+ ],
2072
+ },
2073
+ },
2074
+ {
2075
+ key: 'ra',
2076
+ type: 'input',
2077
+ className: 'col-span-12 lg:col-span-6',
2078
+ props: {
2079
+ label: 'Resident Advisor',
2080
+ placeholder: 'URL de RA',
2081
+ type: 'url',
2082
+ },
2083
+ },
2084
+ {
2085
+ key: 'user',
2086
+ type: 'select',
2087
+ className: 'col-span-12 lg:col-span-6',
2088
+ props: {
2089
+ label: 'Usuario',
2090
+ placeholder: 'Introduce usuario',
2091
+ subtype: 'user',
2092
+ remoteSearch: true,
2093
+ options: [
2094
+ {
2095
+ id: 'user-1',
2096
+ label: 'annamelodia',
2097
+ name: 'annamelodia',
2098
+ },
2099
+ ],
2100
+ },
2101
+ },
2102
+ {
2103
+ key: 'exclusive',
2104
+ type: 'select',
2105
+ className: 'col-span-12 lg:col-span-6',
2106
+ props: {
2107
+ label: 'Exclusivo',
2108
+ hasSearch: false,
2109
+ options: [
2110
+ { _id: true, name: 'Sí' },
2111
+ { _id: false, name: 'No' },
2112
+ ],
2113
+ },
2114
+ },
2115
+ {
2116
+ key: 'bannedTop',
2117
+ type: 'select',
2118
+ className: 'col-span-12 lg:col-span-6',
2119
+ props: {
2120
+ label: 'Baneado del top',
2121
+ hasSearch: false,
2122
+ options: [
2123
+ { _id: true, name: 'Sí' },
2124
+ { _id: false, name: 'No' },
2125
+ ],
2126
+ },
2127
+ },
2128
+ {
2129
+ key: 'bannedVisits',
2130
+ type: 'select',
2131
+ className: 'col-span-12 lg:col-span-6',
2132
+ props: {
2133
+ label: 'Baneado de visitas',
2134
+ hasSearch: false,
2135
+ options: [
2136
+ { _id: true, name: 'Sí' },
2137
+ { _id: false, name: 'No' },
2138
+ ],
2139
+ },
2140
+ },
2141
+ {
2142
+ key: 'state',
2143
+ type: 'select',
2144
+ className: 'col-span-12 lg:col-span-6',
2145
+ props: {
2146
+ label: 'Estado',
2147
+ placeholder: 'Selecciona estado',
2148
+ required: true,
2149
+ options: [
2150
+ { _id: 'active', name: 'Activo' },
2151
+ { _id: 'inactive', name: 'Inactivo' },
2152
+ { _id: 'deleted', name: 'Eliminado' },
2153
+ ],
2154
+ },
2155
+ },
2156
+ {
2157
+ key: 'slug',
2158
+ type: 'input',
2159
+ className: 'col-span-12 lg:col-span-6',
2160
+ props: {
2161
+ label: 'Slug',
2162
+ placeholder: 'berlin-techno-night',
2163
+ readonly: true,
2164
+ },
2165
+ },
2166
+ {
2167
+ key: 'slugOld',
2168
+ type: 'input',
2169
+ className: 'col-span-12 lg:col-span-6',
2170
+ props: {
2171
+ label: 'Slug anterior',
2172
+ placeholder: 'berlin-techno-night-old',
2173
+ readonly: true,
2174
+ },
2175
+ },
2176
+ {
2177
+ key: 'info',
2178
+ type: 'html-editor',
2179
+ className: 'col-span-12',
2180
+ props: {
2181
+ label: 'Información',
2182
+ placeholder: 'Describe el evento',
2183
+ },
2184
+ },
2185
+ ],
2186
+ model: {
2187
+ name: 'Berlin Techno Night',
2188
+ styles: [
2189
+ { id: 'techno', name: 'Techno' },
2190
+ { id: 'hard-techno', name: 'Hard Techno' },
2191
+ ],
2192
+ date: new Date('2026-06-15T23:00:00'),
2193
+ dateEnd: new Date('2026-06-16T06:00:00'),
2194
+ site: { id: 'site-1', name: 'Club Alpha' },
2195
+ artists: [
2196
+ { id: 'artist-1', name: 'Anna Melodia' },
2197
+ { id: 'artist-3', name: 'Luna Nova' },
2198
+ ],
2199
+ country: { id: 'de', name: 'Alemania' },
2200
+ region: { _id: 'berlin', name: 'Berlín' },
2201
+ state: { _id: 'active', name: 'Activo' },
2202
+ exclusive: { _id: false, name: 'No' },
2203
+ slug: 'berlin-techno-night',
2204
+ info: 'Evento semanal de techno en Club Alpha. Lineup: Anna Melodia, Luna Nova y más.',
2205
+ },
2206
+ },
2207
+ },
2208
+ {
2209
+ name: '[ADMIN] Media',
2210
+ description: 'Formulario real de edición de media (sets/tracks) del admin. Tipo, artistas, fuente, enlaces y año.',
2211
+ inputs: {
2212
+ layout: 'stack',
2213
+ fields: [
2214
+ { key: '_id', type: 'hidden' },
2215
+ {
2216
+ key: 'name',
2217
+ type: 'input',
2218
+ className: 'col-span-12 lg:col-span-6',
2219
+ props: {
2220
+ label: 'Nombre',
2221
+ placeholder: 'Introduce el nombre',
2222
+ required: true,
2223
+ },
2224
+ },
2225
+ {
2226
+ key: 'type',
2227
+ type: 'select',
2228
+ className: 'col-span-12 lg:col-span-6',
2229
+ props: {
2230
+ label: 'Tipo',
2231
+ placeholder: 'Selecciona el tipo',
2232
+ required: true,
2233
+ options: [
2234
+ { id: 'set', label: 'Set', name: 'Set' },
2235
+ { id: 'track', label: 'Track', name: 'Track' },
2236
+ {
2237
+ id: 'podcast',
2238
+ label: 'Podcast',
2239
+ name: 'Podcast',
2240
+ },
2241
+ {
2242
+ id: 'radioshow',
2243
+ label: 'Radioshow',
2244
+ name: 'Radioshow',
2245
+ },
2246
+ ],
2247
+ },
2248
+ },
2249
+ {
2250
+ key: 'artists',
2251
+ type: 'select',
2252
+ className: 'col-span-12 lg:col-span-6',
2253
+ props: {
2254
+ label: 'Artistas',
2255
+ placeholder: 'Selecciona artistas',
2256
+ subtype: 'artist',
2257
+ remoteSearch: true,
2258
+ multi: true,
2259
+ options: [
2260
+ {
2261
+ id: 'artist-1',
2262
+ label: 'Anna Melodia',
2263
+ name: 'Anna Melodia',
2264
+ },
2265
+ {
2266
+ id: 'artist-2',
2267
+ label: 'Duo Beats',
2268
+ name: 'Duo Beats',
2269
+ },
2270
+ ],
2271
+ },
2272
+ },
2273
+ {
2274
+ key: 'year',
2275
+ type: 'input',
2276
+ className: 'col-span-12 lg:col-span-6',
2277
+ props: {
2278
+ label: 'Año',
2279
+ placeholder: 'Introduce el año',
2280
+ type: 'number',
2281
+ },
2282
+ },
2283
+ {
2284
+ key: 'source',
2285
+ type: 'select',
2286
+ className: 'col-span-12 lg:col-span-6',
2287
+ props: {
2288
+ label: 'Fuente',
2289
+ placeholder: 'Selecciona fuente',
2290
+ options: [
2291
+ { _id: 'soundcloud', name: 'Soundcloud' },
2292
+ { _id: 'youtube', name: 'Youtube' },
2293
+ ],
2294
+ },
2295
+ },
2296
+ {
2297
+ key: 'sourceUrl',
2298
+ type: 'input',
2299
+ className: 'col-span-12 lg:col-span-6',
2300
+ props: {
2301
+ label: 'URL',
2302
+ placeholder: 'https://soundcloud.com/...',
2303
+ type: 'url',
2304
+ },
2305
+ },
2306
+ {
2307
+ key: 'sourceId',
2308
+ type: 'input',
2309
+ className: 'col-span-12 lg:col-span-6',
2310
+ props: {
2311
+ label: 'ID Media',
2312
+ placeholder: '123456789',
2313
+ },
2314
+ },
2315
+ {
2316
+ key: 'duration',
2317
+ type: 'input',
2318
+ className: 'col-span-12 lg:col-span-6',
2319
+ props: {
2320
+ label: 'Duración (segundos)',
2321
+ placeholder: '3600',
2322
+ type: 'number',
2323
+ },
2324
+ },
2325
+ {
2326
+ key: 'imageUpload',
2327
+ type: 'upload-image',
2328
+ className: 'col-span-12',
2329
+ props: {
2330
+ label: 'Imagen',
2331
+ placeholder: 'Selecciona una imagen',
2332
+ currentImageUrl: 'https://via.placeholder.com/400x400.png?text=Media',
2333
+ },
2334
+ },
2335
+ {
2336
+ key: 'site',
2337
+ type: 'select',
2338
+ className: 'col-span-12 lg:col-span-6',
2339
+ props: {
2340
+ label: 'Sitio',
2341
+ placeholder: 'Introduce sitio',
2342
+ subtype: 'site',
2343
+ remoteSearch: true,
2344
+ options: [
2345
+ {
2346
+ id: 'site-1',
2347
+ label: 'Club Alpha',
2348
+ name: 'Club Alpha',
2349
+ },
2350
+ ],
2351
+ },
2352
+ },
2353
+ {
2354
+ key: 'styles',
2355
+ type: 'select',
2356
+ className: 'col-span-12 lg:col-span-6',
2357
+ props: {
2358
+ label: 'Estilos',
2359
+ placeholder: 'Selecciona estilo/s',
2360
+ multi: true,
2361
+ maxSelections: 5,
2362
+ hasSearch: true,
2363
+ options: [
2364
+ {
2365
+ id: 'techno',
2366
+ label: 'Techno',
2367
+ name: 'Techno',
2368
+ },
2369
+ { id: 'house', label: 'House', name: 'House' },
2370
+ {
2371
+ id: 'deep-house',
2372
+ label: 'Deep House',
2373
+ name: 'Deep House',
2374
+ },
2375
+ {
2376
+ id: 'melodic-techno',
2377
+ label: 'Melodic Techno',
2378
+ name: 'Melodic Techno',
2379
+ },
2380
+ ],
2381
+ },
2382
+ },
2383
+ {
2384
+ key: 'freeDownloadLink',
2385
+ type: 'input',
2386
+ className: 'col-span-12 lg:col-span-6',
2387
+ props: {
2388
+ label: 'Descarga gratuita',
2389
+ placeholder: 'https://...',
2390
+ type: 'url',
2391
+ },
2392
+ },
2393
+ {
2394
+ key: 'buyLink',
2395
+ type: 'input',
2396
+ className: 'col-span-12 lg:col-span-6',
2397
+ props: {
2398
+ label: 'Compra',
2399
+ placeholder: 'https://...',
2400
+ type: 'url',
2401
+ },
2402
+ },
2403
+ {
2404
+ key: 'user',
2405
+ type: 'select',
2406
+ className: 'col-span-12 lg:col-span-6',
2407
+ props: {
2408
+ label: 'Usuario',
2409
+ placeholder: 'Introduce usuario',
2410
+ subtype: 'user',
2411
+ remoteSearch: true,
2412
+ options: [
2413
+ {
2414
+ id: 'user-1',
2415
+ label: 'annamelodia',
2416
+ name: 'annamelodia',
2417
+ },
2418
+ ],
2419
+ },
2420
+ },
2421
+ {
2422
+ key: 'promoted',
2423
+ type: 'select',
2424
+ className: 'col-span-12 lg:col-span-6',
2425
+ props: {
2426
+ label: 'Promocionado',
2427
+ hasSearch: false,
2428
+ options: [
2429
+ { _id: true, name: 'Sí' },
2430
+ { _id: false, name: 'No' },
2431
+ ],
2432
+ },
2433
+ },
2434
+ {
2435
+ key: 'exclusive',
2436
+ type: 'select',
2437
+ className: 'col-span-12 lg:col-span-6',
2438
+ props: {
2439
+ label: 'Exclusivo',
2440
+ hasSearch: false,
2441
+ options: [
2442
+ { _id: true, name: 'Sí' },
2443
+ { _id: false, name: 'No' },
2444
+ ],
2445
+ },
2446
+ },
2447
+ {
2448
+ key: 'bannedTop',
2449
+ type: 'select',
2450
+ className: 'col-span-12 lg:col-span-6',
2451
+ props: {
2452
+ label: 'Baneado del top',
2453
+ hasSearch: false,
2454
+ options: [
2455
+ { _id: true, name: 'Sí' },
2456
+ { _id: false, name: 'No' },
2457
+ ],
2458
+ },
2459
+ },
2460
+ {
2461
+ key: 'bannedVisits',
2462
+ type: 'select',
2463
+ className: 'col-span-12 lg:col-span-6',
2464
+ props: {
2465
+ label: 'Baneado de visitas',
2466
+ hasSearch: false,
2467
+ options: [
2468
+ { _id: true, name: 'Sí' },
2469
+ { _id: false, name: 'No' },
2470
+ ],
2471
+ },
2472
+ },
2473
+ {
2474
+ key: 'state',
2475
+ type: 'select',
2476
+ className: 'col-span-12 lg:col-span-6',
2477
+ props: {
2478
+ label: 'Estado',
2479
+ placeholder: 'Selecciona estado',
2480
+ required: true,
2481
+ options: [
2482
+ { _id: 'active', name: 'Activo' },
2483
+ { _id: 'inactive', name: 'Inactivo' },
2484
+ { _id: 'deleted', name: 'Eliminado' },
2485
+ ],
2486
+ },
2487
+ },
2488
+ {
2489
+ key: 'slug',
2490
+ type: 'input',
2491
+ className: 'col-span-12 lg:col-span-6',
2492
+ props: {
2493
+ label: 'Slug',
2494
+ placeholder: 'melodic-session-001',
2495
+ readonly: true,
2496
+ },
2497
+ },
2498
+ {
2499
+ key: 'slugOld',
2500
+ type: 'input',
2501
+ className: 'col-span-12 lg:col-span-6',
2502
+ props: {
2503
+ label: 'Slug anterior',
2504
+ placeholder: 'melodic-session-001-old',
2505
+ readonly: true,
2506
+ },
2507
+ },
2508
+ {
2509
+ key: 'info',
2510
+ type: 'html-editor',
2511
+ className: 'col-span-12',
2512
+ props: {
2513
+ label: 'Información',
2514
+ placeholder: 'Describe la media',
2515
+ },
2516
+ },
2517
+ ],
2518
+ model: {
2519
+ name: 'Melodic Session 001',
2520
+ type: { id: 'set', name: 'Set' },
2521
+ artists: [{ id: 'artist-1', name: 'Anna Melodia' }],
2522
+ year: 2026,
2523
+ styles: [
2524
+ { id: 'melodic-techno', name: 'Melodic Techno' },
2525
+ ],
2526
+ source: { _id: 'soundcloud', name: 'Soundcloud' },
2527
+ sourceUrl: 'https://soundcloud.com/annamelodia/melodic-session-001',
2528
+ sourceId: '123456789',
2529
+ duration: 3600,
2530
+ site: { id: 'site-1', name: 'Club Alpha' },
2531
+ freeDownloadLink: 'https://freelink.com/annamelodia/melodic-session-001',
2532
+ state: { _id: 'active', name: 'Activo' },
2533
+ promoted: { _id: false, name: 'No' },
2534
+ exclusive: { _id: false, name: 'No' },
2535
+ slug: 'melodic-session-001',
2536
+ info: 'Set grabado en directo en Club Alpha durante la Berlin Techno Night.',
2537
+ },
2538
+ },
2539
+ },
2540
+ {
2541
+ name: '[ADMIN] Sitio',
2542
+ description: 'Formulario real de edición de sitio en el admin. Tipo, dirección, coordenadas, estilos y datos simulados.',
2543
+ inputs: {
2544
+ layout: 'stack',
2545
+ fields: [
2546
+ { key: '_id', type: 'hidden' },
2547
+ {
2548
+ key: 'name',
2549
+ type: 'input',
2550
+ className: 'col-span-12 lg:col-span-6',
2551
+ props: {
2552
+ label: 'Nombre',
2553
+ placeholder: 'Introduce el nombre',
2554
+ required: true,
2555
+ },
2556
+ },
2557
+ {
2558
+ key: 'type',
2559
+ type: 'select',
2560
+ className: 'col-span-12 lg:col-span-6',
2561
+ props: {
2562
+ label: 'Tipo',
2563
+ placeholder: 'Selecciona el tipo',
2564
+ required: true,
2565
+ options: [
2566
+ { id: 'club', label: 'Club', name: 'Club' },
2567
+ {
2568
+ id: 'festival',
2569
+ label: 'Festival',
2570
+ name: 'Festival',
2571
+ },
2572
+ { id: 'bar', label: 'Bar', name: 'Bar' },
2573
+ ],
2574
+ },
2575
+ },
2576
+ {
2577
+ key: 'street',
2578
+ type: 'input',
2579
+ className: 'col-span-12 lg:col-span-6',
2580
+ props: {
2581
+ label: 'Dirección',
2582
+ placeholder: 'Calle, número',
2583
+ required: true,
2584
+ },
2585
+ },
2586
+ {
2587
+ key: 'town',
2588
+ type: 'input',
2589
+ className: 'col-span-12 lg:col-span-6',
2590
+ props: {
2591
+ label: 'Ciudad',
2592
+ placeholder: 'Introduce la población',
2593
+ required: true,
2594
+ },
2595
+ },
2596
+ {
2597
+ key: 'country',
2598
+ type: 'select',
2599
+ className: 'col-span-12 lg:col-span-6',
2600
+ props: {
2601
+ label: 'País',
2602
+ placeholder: 'Selecciona un país',
2603
+ country: true,
2604
+ options: [
2605
+ { id: 'es', label: 'España', name: 'España' },
2606
+ {
2607
+ id: 'de',
2608
+ label: 'Alemania',
2609
+ name: 'Alemania',
2610
+ },
2611
+ { id: 'fr', label: 'Francia', name: 'Francia' },
2612
+ { id: 'it', label: 'Italia', name: 'Italia' },
2613
+ ],
2614
+ required: true,
2615
+ },
2616
+ },
2617
+ {
2618
+ key: 'region',
2619
+ type: 'select',
2620
+ className: 'col-span-12 lg:col-span-6',
2621
+ props: {
2622
+ label: 'Región',
2623
+ subtype: 'region',
2624
+ options: [
2625
+ { _id: 'berlin', name: 'Berlín' },
2626
+ { _id: 'barcelona', name: 'Barcelona' },
2627
+ ],
2628
+ },
2629
+ },
2630
+ {
2631
+ key: 'lat',
2632
+ type: 'input',
2633
+ className: 'col-span-12 lg:col-span-6',
2634
+ props: {
2635
+ label: 'Latitud',
2636
+ placeholder: '52.5200',
2637
+ type: 'number',
2638
+ },
2639
+ },
2640
+ {
2641
+ key: 'lng',
2642
+ type: 'input',
2643
+ className: 'col-span-12 lg:col-span-6',
2644
+ props: {
2645
+ label: 'Longitud',
2646
+ placeholder: '13.4050',
2647
+ type: 'number',
2648
+ },
2649
+ },
2650
+ {
2651
+ key: 'capacity',
2652
+ type: 'input',
2653
+ className: 'col-span-12 lg:col-span-6',
2654
+ props: {
2655
+ label: 'Aforo',
2656
+ placeholder: '1500',
2657
+ type: 'number',
2658
+ },
2659
+ },
2660
+ {
2661
+ key: 'styles',
2662
+ type: 'select',
2663
+ className: 'col-span-12 lg:col-span-6',
2664
+ props: {
2665
+ label: 'Estilos',
2666
+ placeholder: 'Selecciona estilo/s',
2667
+ multi: true,
2668
+ maxSelections: 5,
2669
+ hasSearch: true,
2670
+ options: [
2671
+ {
2672
+ id: 'techno',
2673
+ label: 'Techno',
2674
+ name: 'Techno',
2675
+ },
2676
+ { id: 'house', label: 'House', name: 'House' },
2677
+ {
2678
+ id: 'deep-house',
2679
+ label: 'Deep House',
2680
+ name: 'Deep House',
2681
+ },
2682
+ ],
2683
+ },
2684
+ },
2685
+ {
2686
+ key: 'imageUpload',
2687
+ type: 'upload-image',
2688
+ className: 'col-span-12',
2689
+ props: {
2690
+ label: 'Imagen',
2691
+ placeholder: 'Selecciona una imagen',
2692
+ currentImageUrl: 'https://via.placeholder.com/800x400.png?text=Club+Alpha',
2693
+ },
2694
+ },
2695
+ {
2696
+ key: 'social',
2697
+ type: 'social',
2698
+ className: 'col-span-12',
2699
+ props: { label: 'Redes sociales', admin: true },
2700
+ },
2701
+ {
2702
+ key: 'user',
2703
+ type: 'select',
2704
+ className: 'col-span-12 lg:col-span-6',
2705
+ props: {
2706
+ label: 'Usuario',
2707
+ placeholder: 'Introduce usuario',
2708
+ subtype: 'user',
2709
+ remoteSearch: true,
2710
+ options: [
2711
+ {
2712
+ id: 'user-1',
2713
+ label: 'annamelodia',
2714
+ name: 'annamelodia',
2715
+ },
2716
+ ],
2717
+ },
2718
+ },
2719
+ {
2720
+ key: 'promoted',
2721
+ type: 'select',
2722
+ className: 'col-span-12 lg:col-span-6',
2723
+ props: {
2724
+ label: 'Promocionado',
2725
+ hasSearch: false,
2726
+ options: [
2727
+ { _id: true, name: 'Sí' },
2728
+ { _id: false, name: 'No' },
2729
+ ],
2730
+ },
2731
+ },
2732
+ {
2733
+ key: 'exclusive',
2734
+ type: 'select',
2735
+ className: 'col-span-12 lg:col-span-6',
2736
+ props: {
2737
+ label: 'Exclusivo',
2738
+ hasSearch: false,
2739
+ options: [
2740
+ { _id: true, name: 'Sí' },
2741
+ { _id: false, name: 'No' },
2742
+ ],
2743
+ },
2744
+ },
2745
+ {
2746
+ key: 'bannedTop',
2747
+ type: 'select',
2748
+ className: 'col-span-12 lg:col-span-6',
2749
+ props: {
2750
+ label: 'Baneado del top',
2751
+ hasSearch: false,
2752
+ options: [
2753
+ { _id: true, name: 'Sí' },
2754
+ { _id: false, name: 'No' },
2755
+ ],
2756
+ },
2757
+ },
2758
+ {
2759
+ key: 'bannedVisits',
2760
+ type: 'select',
2761
+ className: 'col-span-12 lg:col-span-6',
2762
+ props: {
2763
+ label: 'Baneado de visitas',
2764
+ hasSearch: false,
2765
+ options: [
2766
+ { _id: true, name: 'Sí' },
2767
+ { _id: false, name: 'No' },
2768
+ ],
2769
+ },
2770
+ },
2771
+ {
2772
+ key: 'state',
2773
+ type: 'select',
2774
+ className: 'col-span-12 lg:col-span-6',
2775
+ props: {
2776
+ label: 'Estado',
2777
+ placeholder: 'Selecciona estado',
2778
+ required: true,
2779
+ options: [
2780
+ { _id: 'active', name: 'Activo' },
2781
+ { _id: 'inactive', name: 'Inactivo' },
2782
+ ],
2783
+ },
2784
+ },
2785
+ {
2786
+ key: 'slug',
2787
+ type: 'input',
2788
+ className: 'col-span-12 lg:col-span-6',
2789
+ props: {
2790
+ label: 'Slug',
2791
+ placeholder: 'club-alpha',
2792
+ readonly: true,
2793
+ },
2794
+ },
2795
+ {
2796
+ key: 'slugOld',
2797
+ type: 'input',
2798
+ className: 'col-span-12 lg:col-span-6',
2799
+ props: {
2800
+ label: 'Slug anterior',
2801
+ placeholder: 'club-alpha-old',
2802
+ readonly: true,
2803
+ },
2804
+ },
2805
+ {
2806
+ key: 'info',
2807
+ type: 'html-editor',
2808
+ className: 'col-span-12',
2809
+ props: {
2810
+ label: 'Información',
2811
+ placeholder: 'Describe el sitio',
2812
+ },
2813
+ },
2814
+ ],
2815
+ model: {
2816
+ name: 'Club Alpha',
2817
+ type: { id: 'club', name: 'Club' },
2818
+ street: 'Rüdersdorfer Str. 1',
2819
+ town: 'Berlín',
2820
+ country: { id: 'de', name: 'Alemania' },
2821
+ region: { _id: 'berlin', name: 'Berlín' },
2822
+ lat: 52.52,
2823
+ lng: 13.405,
2824
+ capacity: 1500,
2825
+ styles: [{ id: 'techno', name: 'Techno' }],
2826
+ state: { _id: 'active', name: 'Activo' },
2827
+ promoted: { _id: true, name: 'Sí' },
2828
+ exclusive: { _id: false, name: 'No' },
2829
+ slug: 'club-alpha',
2830
+ info: 'Club de techno en Berlín Friedrichshain. Reconocido por su sistema de sonido Funktion-One.',
2831
+ },
2832
+ },
2833
+ },
2834
+ {
2835
+ name: '[ADMIN] Usuario',
2836
+ description: 'Formulario real de edición de usuario del admin. Email, rol, país, idioma, tipo y datos simulados.',
2837
+ inputs: {
2838
+ layout: 'stack',
2839
+ fields: [
2840
+ { key: '_id', type: 'hidden' },
2841
+ {
2842
+ key: 'name',
2843
+ type: 'input',
2844
+ className: 'col-span-12 lg:col-span-6',
2845
+ props: {
2846
+ label: 'Nombre',
2847
+ placeholder: 'Introduce nombre',
2848
+ required: true,
2849
+ },
2850
+ },
2851
+ {
2852
+ key: 'email',
2853
+ type: 'input',
2854
+ className: 'col-span-12 lg:col-span-6',
2855
+ props: {
2856
+ label: 'Email',
2857
+ placeholder: 'user@email.com',
2858
+ type: 'email',
2859
+ required: true,
2860
+ },
2861
+ },
2862
+ {
2863
+ key: 'country',
2864
+ type: 'select',
2865
+ className: 'col-span-12 lg:col-span-6',
2866
+ props: {
2867
+ label: 'País',
2868
+ placeholder: 'Selecciona un país',
2869
+ country: true,
2870
+ options: [
2871
+ { id: 'es', label: 'España', name: 'España' },
2872
+ {
2873
+ id: 'de',
2874
+ label: 'Alemania',
2875
+ name: 'Alemania',
2876
+ },
2877
+ { id: 'fr', label: 'Francia', name: 'Francia' },
2878
+ {
2879
+ id: 'uk',
2880
+ label: 'Reino Unido',
2881
+ name: 'Reino Unido',
2882
+ },
2883
+ ],
2884
+ },
2885
+ },
2886
+ {
2887
+ key: 'region',
2888
+ type: 'select',
2889
+ className: 'col-span-12 lg:col-span-6',
2890
+ props: {
2891
+ label: 'Región',
2892
+ subtype: 'region',
2893
+ options: [
2894
+ { _id: 'madrid', name: 'Madrid' },
2895
+ { _id: 'barcelona', name: 'Barcelona' },
2896
+ { _id: 'berlin', name: 'Berlín' },
2897
+ ],
2898
+ },
2899
+ },
2900
+ {
2901
+ key: 'favoriteStyles',
2902
+ type: 'select',
2903
+ className: 'col-span-12',
2904
+ props: {
2905
+ label: 'Estilos favoritos',
2906
+ placeholder: 'Selecciona estilo/s',
2907
+ multi: true,
2908
+ maxSelections: 5,
2909
+ hasSearch: true,
2910
+ options: [
2911
+ {
2912
+ id: 'techno',
2913
+ label: 'Techno',
2914
+ name: 'Techno',
2915
+ },
2916
+ { id: 'house', label: 'House', name: 'House' },
2917
+ {
2918
+ id: 'deep-house',
2919
+ label: 'Deep House',
2920
+ name: 'Deep House',
2921
+ },
2922
+ ],
2923
+ },
2924
+ },
2925
+ {
2926
+ key: 'language',
2927
+ type: 'select',
2928
+ className: 'col-span-12 lg:col-span-6',
2929
+ props: {
2930
+ label: 'Idioma',
2931
+ placeholder: 'Selecciona un idioma',
2932
+ required: true,
2933
+ options: [
2934
+ { id: 'es', label: 'Español', name: 'Español' },
2935
+ { id: 'en', label: 'Inglés', name: 'Inglés' },
2936
+ { id: 'de', label: 'Alemán', name: 'Alemán' },
2937
+ ],
2938
+ },
2939
+ },
2940
+ {
2941
+ key: 'role',
2942
+ type: 'select',
2943
+ className: 'col-span-12 lg:col-span-6',
2944
+ props: {
2945
+ label: 'Rol',
2946
+ placeholder: 'Selecciona rol',
2947
+ required: true,
2948
+ options: [
2949
+ { _id: 'ADMIN', name: 'Administrador' },
2950
+ { _id: 'USER', name: 'Usuario' },
2951
+ { _id: 'MODERATOR', name: 'Moderador' },
2952
+ ],
2953
+ },
2954
+ },
2955
+ {
2956
+ key: 'type',
2957
+ type: 'select',
2958
+ className: 'col-span-12 lg:col-span-6',
2959
+ props: {
2960
+ label: 'Tipo',
2961
+ placeholder: 'Selecciona tipo',
2962
+ required: true,
2963
+ options: [
2964
+ { _id: 'NORMAL', name: 'Normal' },
2965
+ { _id: 'ARTIST', name: 'Artista' },
2966
+ { _id: 'PROMOTER', name: 'Promotor' },
2967
+ { _id: 'RECORD_LABEL', name: 'Record Label' },
2968
+ ],
2969
+ },
2970
+ },
2971
+ {
2972
+ key: 'imageUpload',
2973
+ type: 'upload-image',
2974
+ className: 'col-span-12',
2975
+ props: {
2976
+ label: 'Avatar',
2977
+ placeholder: 'Selecciona una imagen',
2978
+ currentImageUrl: 'https://via.placeholder.com/200x200.png?text=User',
2979
+ },
2980
+ },
2981
+ {
2982
+ key: 'subscriptionTier',
2983
+ type: 'select',
2984
+ className: 'col-span-12 lg:col-span-6',
2985
+ props: {
2986
+ label: 'Suscripción',
2987
+ placeholder: 'Selecciona suscripción',
2988
+ options: [
2989
+ { _id: 'FREE', name: 'Free' },
2990
+ { _id: 'PREMIUM', name: 'Premium' },
2991
+ ],
2992
+ },
2993
+ },
2994
+ {
2995
+ key: 'bannedVisits',
2996
+ type: 'select',
2997
+ className: 'col-span-12 lg:col-span-6',
2998
+ props: {
2999
+ label: 'Baneado de visitas',
3000
+ hasSearch: false,
3001
+ options: [
3002
+ { _id: true, name: 'Sí' },
3003
+ { _id: false, name: 'No' },
3004
+ ],
3005
+ },
3006
+ },
3007
+ {
3008
+ key: 'bannedFromChat',
3009
+ type: 'select',
3010
+ className: 'col-span-12 lg:col-span-6',
3011
+ props: {
3012
+ label: 'Chats baneados',
3013
+ hasSearch: false,
3014
+ options: [
3015
+ { _id: true, name: 'Sí' },
3016
+ { _id: false, name: 'No' },
3017
+ ],
3018
+ },
3019
+ },
3020
+ {
3021
+ key: 'cookiesAccepted',
3022
+ type: 'select',
3023
+ className: 'col-span-12 lg:col-span-6',
3024
+ props: {
3025
+ label: 'Cookies Aceptadas',
3026
+ hasSearch: false,
3027
+ options: [
3028
+ { _id: true, name: 'Sí' },
3029
+ { _id: false, name: 'No' },
3030
+ ],
3031
+ },
3032
+ },
3033
+ {
3034
+ key: 'state',
3035
+ type: 'select',
3036
+ className: 'col-span-12 lg:col-span-6',
3037
+ props: {
3038
+ label: 'Estado',
3039
+ placeholder: 'Selecciona estado',
3040
+ required: true,
3041
+ options: [
3042
+ { _id: 'active', name: 'Activo' },
3043
+ { _id: 'inactive', name: 'Inactivo' },
3044
+ { _id: 'banned', name: 'Baneado' },
3045
+ ],
3046
+ },
3047
+ },
3048
+ {
3049
+ key: 'info',
3050
+ type: 'html-editor',
3051
+ className: 'col-span-12',
3052
+ props: {
3053
+ label: 'Información',
3054
+ placeholder: 'Introduce info',
3055
+ },
3056
+ },
3057
+ ],
3058
+ model: {
3059
+ name: 'María García',
3060
+ email: 'maria@example.com',
3061
+ country: { id: 'es', name: 'España' },
3062
+ region: { _id: 'madrid', name: 'Madrid' },
3063
+ favoriteStyles: [
3064
+ { id: 'techno', name: 'Techno' },
3065
+ { id: 'house', name: 'House' },
3066
+ ],
3067
+ language: { id: 'es', name: 'Español' },
3068
+ role: { _id: 'ADMIN', name: 'Administrador' },
3069
+ type: { _id: 'NORMAL', name: 'Normal' },
3070
+ subscriptionTier: { _id: 'FREE', name: 'Free' },
3071
+ state: { _id: 'active', name: 'Activo' },
3072
+ bannedVisits: { _id: false, name: 'No' },
3073
+ bannedFromChat: { _id: false, name: 'No' },
3074
+ cookiesAccepted: { _id: true, name: 'Sí' },
3075
+ info: 'Administradora de la plataforma.',
3076
+ },
3077
+ },
3078
+ },
3079
+ {
3080
+ name: 'Compact (para headers)',
3081
+ description: 'Formulario real de cambio de contraseña con los tres inputs usados en la app.',
3082
+ inputs: {
3083
+ layout: 'stack',
3084
+ fields: [
3085
+ {
3086
+ key: 'passwordCurrent',
3087
+ type: 'input',
3088
+ className: 'col-span-12 lg:col-span-12',
3089
+ props: {
3090
+ label: 'Contraseña actual',
3091
+ placeholder: 'Introduce tu contraseña actual',
3092
+ type: 'password',
3093
+ required: true,
3094
+ },
3095
+ },
3096
+ {
3097
+ key: 'passwordNew',
3098
+ type: 'input',
3099
+ className: 'col-span-12 lg:col-span-6',
3100
+ props: {
3101
+ label: 'Nueva contraseña',
3102
+ placeholder: 'Introduce tu nueva contraseña',
3103
+ type: 'password',
3104
+ required: true,
3105
+ },
3106
+ },
3107
+ {
3108
+ key: 'passwordNewConfirm',
3109
+ type: 'input',
3110
+ className: 'col-span-12 lg:col-span-6',
3111
+ props: {
3112
+ label: 'Confirmar contraseña',
3113
+ placeholder: 'Repite tu nueva contraseña',
3114
+ type: 'password',
3115
+ required: true,
3116
+ },
3117
+ },
3118
+ ],
3119
+ },
3120
+ },
3121
+ {
3122
+ name: 'Compact (para headers)',
3123
+ description: 'Versión compacta para usar en cabeceras y títulos. Inputs más pequeños, sin espaciado vertical.',
3124
+ inputs: {
3125
+ size: 'compact',
3126
+ layout: 'stack',
3127
+ fields: [
3128
+ {
3129
+ key: 'period',
3130
+ type: 'select',
3131
+ className: 'col-span-12',
3132
+ props: {
3133
+ placeholder: 'Selecciona periodo',
3134
+ options: [
3135
+ {
3136
+ id: '7d',
3137
+ label: 'Ultimos 7 dias',
3138
+ name: 'Ultimos 7 dias',
3139
+ },
3140
+ {
3141
+ id: '15d',
3142
+ label: 'Ultimos 15 dias',
3143
+ name: 'Ultimos 15 dias',
3144
+ },
3145
+ {
3146
+ id: '30d',
3147
+ label: 'Ultimo mes',
3148
+ name: 'Ultimo mes',
3149
+ },
3150
+ ],
3151
+ },
3152
+ },
3153
+ ],
3154
+ },
3155
+ },
3156
+ {
3157
+ name: '[APP] Crear setup',
3158
+ description: 'Formulario de creación de equipment setup con nombre, componentes del setup e información.',
3159
+ inputs: {
3160
+ layout: 'stack',
3161
+ model: {
3162
+ name: '',
3163
+ components: [
3164
+ {
3165
+ id: 'eq-1',
3166
+ name: 'CDJ-3000',
3167
+ manufacturer: 'Pioneer DJ',
3168
+ image: true,
3169
+ position: 0,
3170
+ },
3171
+ {
3172
+ id: 'eq-2',
3173
+ name: 'DJM-A9',
3174
+ manufacturer: 'Pioneer DJ',
3175
+ image: true,
3176
+ position: 1,
3177
+ },
3178
+ ],
3179
+ info: '',
3180
+ },
3181
+ fields: [
3182
+ {
3183
+ key: 'name',
3184
+ type: 'input',
3185
+ className: 'col-span-12 lg:col-span-6',
3186
+ props: {
3187
+ label: 'Nombre del setup',
3188
+ placeholder: 'Ej: Cabina DJ principal',
3189
+ required: true,
3190
+ },
3191
+ },
3192
+ {
3193
+ key: 'components',
3194
+ type: 'entity-picker',
3195
+ className: 'col-span-12',
3196
+ props: {
3197
+ typeItem: 'equipment',
3198
+ iconFallback: 'microchip',
3199
+ onSearch: async (query) => {
3200
+ const mockEquipments = [
3201
+ {
3202
+ _id: 'eq-1',
3203
+ name: 'CDJ-3000',
3204
+ manufacturer: 'Pioneer DJ',
3205
+ image: true,
3206
+ },
3207
+ {
3208
+ _id: 'eq-2',
3209
+ name: 'DJM-A9',
3210
+ manufacturer: 'Pioneer DJ',
3211
+ image: true,
3212
+ },
3213
+ {
3214
+ _id: 'eq-3',
3215
+ name: 'XDJ-RX3',
3216
+ manufacturer: 'Pioneer DJ',
3217
+ image: true,
3218
+ },
3219
+ {
3220
+ _id: 'eq-4',
3221
+ name: 'Technics SL-1210MK7',
3222
+ manufacturer: 'Technics',
3223
+ image: true,
3224
+ },
3225
+ {
3226
+ _id: 'eq-5',
3227
+ name: 'HDJ-X10',
3228
+ manufacturer: 'Pioneer DJ',
3229
+ image: false,
3230
+ },
3231
+ {
3232
+ _id: 'eq-6',
3233
+ name: 'RMX-1000',
3234
+ manufacturer: 'Pioneer DJ',
3235
+ image: false,
3236
+ },
3237
+ {
3238
+ _id: 'eq-7',
3239
+ name: 'DJS-1000',
3240
+ manufacturer: 'Pioneer DJ',
3241
+ image: false,
3242
+ },
3243
+ {
3244
+ _id: 'eq-8',
3245
+ name: 'V10',
3246
+ manufacturer: 'Allen & Heath',
3247
+ image: true,
3248
+ },
3249
+ {
3250
+ _id: 'eq-9',
3251
+ name: 'Xone:96',
3252
+ manufacturer: 'Allen & Heath',
3253
+ image: true,
3254
+ },
3255
+ {
3256
+ _id: 'eq-10',
3257
+ name: 'Model 1.4',
3258
+ manufacturer: 'Richie Hawtin',
3259
+ image: false,
3260
+ },
3261
+ ];
3262
+ if (!query.trim())
3263
+ return [];
3264
+ const q = query.toLowerCase();
3265
+ return mockEquipments.filter((e) => e.name.toLowerCase().includes(q) ||
3266
+ e.manufacturer.toLowerCase().includes(q));
3267
+ },
3268
+ onCreate: async () => {
3269
+ return {
3270
+ _id: 'eq-new-' + Date.now(),
3271
+ name: 'Nuevo equipo',
3272
+ manufacturer: 'Fabricante',
3273
+ image: false,
3274
+ };
3275
+ },
3276
+ getImageUrl: (item) => item['image'] ? item._id : '',
3277
+ },
3278
+ },
3279
+ {
3280
+ key: 'info',
3281
+ type: 'html-editor',
3282
+ className: 'col-span-12',
3283
+ props: {
3284
+ label: 'Información',
3285
+ placeholder: 'Describe tu setup...',
3286
+ },
3287
+ },
3288
+ ],
3289
+ },
3290
+ },
3291
+ {
3292
+ name: '[ADMIN] Import Media — inline edit',
3293
+ description: 'Simula la edición inline de import-media con selects multi remotos para artistas y marcas. Valida ancho del dropdown, scroll en contenedor y ordenación selected-first.',
3294
+ inputs: {
3295
+ size: 'compact',
3296
+ layout: 'stack',
3297
+ model: {
3298
+ name: 'Melodic Session 001',
3299
+ type: { id: 'track', name: 'Track' },
3300
+ artists: [
3301
+ { id: 'artist-1', name: 'Anna Melodia' },
3302
+ { id: 'artist-3', name: 'Luna Nova' },
3303
+ ],
3304
+ organization: [
3305
+ { id: 'org-1', name: 'Afterlife Records' },
3306
+ ],
3307
+ },
3308
+ fields: [
3309
+ {
3310
+ key: 'name',
3311
+ type: 'input',
3312
+ className: 'col-span-12',
3313
+ props: {
3314
+ label: 'Título',
3315
+ placeholder: 'Nombre del track/set',
3316
+ required: true,
3317
+ },
3318
+ },
3319
+ {
3320
+ key: 'type',
3321
+ type: 'select',
3322
+ className: 'col-span-12 sm:col-span-6',
3323
+ props: {
3324
+ label: 'Tipo',
3325
+ placeholder: 'Selecciona tipo',
3326
+ options: [
3327
+ { id: 'track', name: 'Track' },
3328
+ { id: 'set', name: 'Set' },
3329
+ { id: 'podcast', name: 'Podcast' },
3330
+ ],
3331
+ },
3332
+ },
3333
+ {
3334
+ key: 'artists',
3335
+ type: 'select',
3336
+ className: 'col-span-12 sm:col-span-6',
3337
+ props: {
3338
+ label: 'Artist',
3339
+ placeholder: 'Busca y selecciona artistas...',
3340
+ subtype: 'artist',
3341
+ multi: true,
3342
+ hasSearch: true,
3343
+ remoteSearch: true,
3344
+ onSearch: async (query) => {
3345
+ const all = [
3346
+ {
3347
+ _id: 'artist-1',
3348
+ name: 'Anna Melodia',
3349
+ subline: 'Melodic Techno',
3350
+ },
3351
+ {
3352
+ _id: 'artist-2',
3353
+ name: 'Duo Beats',
3354
+ subline: 'House / Tech House',
3355
+ },
3356
+ {
3357
+ _id: 'artist-3',
3358
+ name: 'Luna Nova',
3359
+ subline: 'Progressive',
3360
+ },
3361
+ {
3362
+ _id: 'artist-4',
3363
+ name: 'Solar Drift',
3364
+ subline: 'Ambient / Downtempo',
3365
+ },
3366
+ {
3367
+ _id: 'artist-5',
3368
+ name: 'Kai Zenith',
3369
+ subline: 'Hard Techno',
3370
+ },
3371
+ {
3372
+ _id: 'artist-6',
3373
+ name: 'Nova Wave',
3374
+ subline: 'Indie Dance',
3375
+ },
3376
+ {
3377
+ _id: 'artist-7',
3378
+ name: 'Echo Protocol',
3379
+ subline: 'Deep House',
3380
+ },
3381
+ {
3382
+ _id: 'artist-8',
3383
+ name: 'Phase Terminal',
3384
+ subline: 'Techno',
3385
+ },
3386
+ ];
3387
+ return query
3388
+ ? all.filter((a) => a.name
3389
+ .toLowerCase()
3390
+ .includes(query.toLowerCase()))
3391
+ : all;
3392
+ },
3393
+ options: [
3394
+ {
3395
+ _id: 'artist-1',
3396
+ name: 'Anna Melodia',
3397
+ subline: 'Melodic Techno',
3398
+ },
3399
+ {
3400
+ _id: 'artist-2',
3401
+ name: 'Duo Beats',
3402
+ subline: 'House / Tech House',
3403
+ },
3404
+ {
3405
+ _id: 'artist-3',
3406
+ name: 'Luna Nova',
3407
+ subline: 'Progressive',
3408
+ },
3409
+ ],
3410
+ },
3411
+ },
3412
+ {
3413
+ key: 'organization',
3414
+ type: 'select',
3415
+ className: 'col-span-12 sm:col-span-6',
3416
+ props: {
3417
+ label: 'Brand',
3418
+ placeholder: 'Busca marca...',
3419
+ multi: true,
3420
+ hasSearch: true,
3421
+ remoteSearch: true,
3422
+ onSearch: async (query) => {
3423
+ const all = [
3424
+ { _id: 'org-1', name: 'Afterlife Records' },
3425
+ { _id: 'org-2', name: 'Innervisions' },
3426
+ { _id: 'org-3', name: 'Drumcode' },
3427
+ { _id: 'org-4', name: 'Diynamic' },
3428
+ { _id: 'org-5', name: 'Hotflush Recordings' },
3429
+ { _id: 'org-6', name: 'Cocoon Recordings' },
3430
+ { _id: 'org-7', name: 'Soma Records' },
3431
+ { _id: 'org-8', name: 'BPitch Control' },
3432
+ ];
3433
+ return query
3434
+ ? all.filter((o) => o.name
3435
+ .toLowerCase()
3436
+ .includes(query.toLowerCase()))
3437
+ : all;
3438
+ },
3439
+ options: [
3440
+ { _id: 'org-1', name: 'Afterlife Records' },
3441
+ { _id: 'org-2', name: 'Innervisions' },
3442
+ { _id: 'org-3', name: 'Drumcode' },
3443
+ ],
3444
+ },
3445
+ },
3446
+ ],
3447
+ },
3448
+ },
3449
+ ],
3450
+ };
3451
+
3452
+ export { story };
3453
+ //# sourceMappingURL=xsmusices-ui-xs-formly.xsstory-Bjne7mpZ.mjs.map