wagtail-enap-designsystem 1.2.1.127__py3-none-any.whl → 1.2.1.128__py3-none-any.whl

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.
@@ -657,7 +657,7 @@ class CheckboxMultiRedirectFieldBlock(blocks.StructBlock):
657
657
  label="Opções e Ações",
658
658
  help_text="Configure as opções e o que acontece para cada uma",
659
659
  min_num=1,
660
- max_num=5
660
+ max_num=10
661
661
  )
662
662
 
663
663
  class Meta:
@@ -728,12 +728,250 @@ class ConditionalFieldBlock(blocks.StructBlock):
728
728
  label = "🔗 Campo Condicional"
729
729
 
730
730
 
731
- # 3. POR ÚLTIMO: Criar a lista final com os campos avançados
731
+
732
+
733
+ class SmartNavigationFieldBlock(blocks.StructBlock):
734
+ """Campo que pode redirecionar para qualquer seção do formulário"""
735
+
736
+ # Pergunta principal
737
+ label = blocks.CharBlock(
738
+ label="Pergunta",
739
+ max_length=255,
740
+ help_text="Ex: Você possui conhecimento na temática do curso?"
741
+ )
742
+
743
+ help_text = blocks.CharBlock(
744
+ label="Texto de ajuda",
745
+ required=False
746
+ )
747
+
748
+ required = blocks.BooleanBlock(
749
+ label="Obrigatório",
750
+ default=True
751
+ )
752
+
753
+ # Tipo do campo
754
+ field_type = blocks.ChoiceBlock(
755
+ label="Tipo de campo",
756
+ choices=[
757
+ ('radio', '🔘 Sim/Não (Radio)'),
758
+ ('dropdown', '📋 Lista Suspensa'),
759
+ ('checkbox', '☑️ Checkbox único'),
760
+ ],
761
+ default='radio'
762
+ )
763
+
764
+ # Opções com navegação
765
+ navigation_options = blocks.StreamBlock([
766
+ ('option', blocks.StructBlock([
767
+ ('value', blocks.CharBlock(
768
+ label="Texto da opção",
769
+ max_length=255,
770
+ help_text="Ex: 'Sim', 'Não', 'Concordo'"
771
+ )),
772
+
773
+ ('action_type', blocks.ChoiceBlock(
774
+ label="Tipo de ação",
775
+ choices=[
776
+ ('continue', '➡️ Continuar para próximo campo'),
777
+ ('jump_to_section', '🎯 Pular para seção específica'),
778
+ ('finish_form', '✅ Finalizar formulário'),
779
+ ('show_message_and_finish', '📝 Mostrar mensagem e finalizar'),
780
+ ],
781
+ default='continue'
782
+ )),
783
+
784
+ ('target_section_name', blocks.CharBlock(
785
+ label="Nome da seção de destino",
786
+ max_length=255,
787
+ required=False,
788
+ help_text="Nome EXATO do divisor de destino (ex: 'DADOS PESSOAIS E PROFISSIONAIS')"
789
+ )),
790
+
791
+ ('finish_message', blocks.RichTextBlock(
792
+ label="Mensagem de finalização",
793
+ required=False,
794
+ features=['bold', 'italic'],
795
+ help_text="Mensagem mostrada quando formulário é finalizado por esta opção"
796
+ )),
797
+
798
+ ('custom_thank_you_title', blocks.CharBlock(
799
+ label="Título personalizado de agradecimento",
800
+ max_length=255,
801
+ required=False,
802
+ help_text="Ex: 'A ENAP AGRADECE SUA PARTICIPAÇÃO!'"
803
+ ))
804
+ ], label="Opção de Navegação"))
805
+ ],
806
+ label="Opções e Navegação",
807
+ help_text="Configure para onde cada resposta leva o usuário",
808
+ min_num=1,
809
+ max_num=10
810
+ )
811
+
812
+ class Meta:
813
+ icon = "redirect"
814
+ label = "🧭 Campo com Navegação Inteligente"
815
+
816
+
817
+ class SectionDividerBlock(blocks.StructBlock):
818
+ """Divisor que marca seções navegáveis"""
819
+ section_name = blocks.CharBlock(
820
+ label="Nome da Seção",
821
+ max_length=255,
822
+ help_text="Nome único para navegação (ex: 'DADOS PESSOAIS')"
823
+ )
824
+
825
+ title = blocks.CharBlock(
826
+ label="Título visível",
827
+ max_length=255,
828
+ help_text="Título que aparece para o usuário"
829
+ )
830
+
831
+ subtitle = blocks.CharBlock(
832
+ label="Subtítulo",
833
+ max_length=500,
834
+ required=False
835
+ )
836
+
837
+ is_hidden_by_default = blocks.BooleanBlock(
838
+ label="Seção oculta por padrão",
839
+ default=False,
840
+ help_text="Se marcado, só aparece quando navegado para ela"
841
+ )
842
+
843
+ class Meta:
844
+ icon = "horizontalrule"
845
+ label = "📍 Divisor de Seção Navegável"
846
+
847
+
848
+
849
+
850
+ FORM_CONDICIONAL = [
851
+ ('checkbox_multi_redirect_field', CheckboxMultiRedirectFieldBlock()),
852
+ ('conditional_field', ConditionalFieldBlock()),
853
+ ('section_divider', SectionDividerBlock()),
854
+ ('smart_navigation_field', SmartNavigationFieldBlock()),
855
+ ('section_header', SectionHeaderBlock()),
856
+ ('text_field', TextFieldBlock()),
857
+ ('email_field', EmailFieldBlock()),
858
+ ('cpf_field', CPFFieldBlock()),
859
+ ('cnpj_field', CNPJFieldBlock()),
860
+ ('phone_field', PhoneFieldBlock()),
861
+ ('textarea_field', TextAreaFieldBlock()),
862
+ ('number_field', NumberFieldBlock()),
863
+ ('date_field', DateFieldBlock()),
864
+ ('dropdown_field', DropdownFieldBlock()),
865
+ ('estado_cidade_field', EstadoCidadeFieldBlock()),
866
+ ('radio_field', RadioFieldBlock()),
867
+ ('checkbox_field', CheckboxFieldBlock()),
868
+ ('checkbox_multiple_field', CheckboxMultipleFieldBlock()),
869
+ ('file_upload_field', FileUploadFieldBlock()),
870
+ ('rating_field', RatingFieldBlock()),
871
+ ('info_text', InfoTextBlock()),
872
+ ('divider', DividerBlock()),
873
+ ('nome_completo_field', NomeCompletoFieldBlock()),
874
+ ]
875
+
876
+
877
+
878
+ class ConditionalFieldBlockCondicional(blocks.StructBlock):
879
+ """Campo com ramificações condicionais"""
880
+
881
+ # Pergunta principal
882
+ label_con = blocks.CharBlock(
883
+ label="Pergunta",
884
+ required=False,
885
+ max_length=255,
886
+ help_text="Ex: Qual país? / Precisa de acessibilidade?"
887
+ )
888
+
889
+ help_text_con = blocks.CharBlock(
890
+ label="Texto de ajuda",
891
+ required=False
892
+ )
893
+
894
+ required_con = blocks.BooleanBlock(
895
+ label="Obrigatório",
896
+ default=True
897
+ )
898
+
899
+ # Tipo do campo principal
900
+ field_type_con = blocks.ChoiceBlock(
901
+ label="Tipo do campo",
902
+ choices=[
903
+ ('dropdown', '📋 Lista Suspensa'),
904
+ ('radio', '🔘 Botões de Rádio'),
905
+ ],
906
+ default='dropdown'
907
+ )
908
+
909
+ # Opções com ramificações
910
+ conditional_options_con = blocks.StreamBlock([
911
+ ('option_con', blocks.StructBlock([
912
+ ('value_con', blocks.CharBlock(
913
+ label="Opção",
914
+ max_length=255,
915
+ help_text="Ex: Brasil, Sim, Empresa"
916
+ )),
917
+ ('action_con', blocks.ChoiceBlock(
918
+ label="Quando escolher esta opção",
919
+ choices=[
920
+ ('show_fields_con', '👁️ Mostrar campos'),
921
+ ('nothing_con', '➡️ Não fazer nada (pular)'),
922
+ ],
923
+ default='nothing_con'
924
+ )),
925
+ ('fields_to_show_con', blocks.StreamBlock(
926
+ FORM_CONDICIONAL,
927
+ label="Campos que aparecem",
928
+ required=False,
929
+ help_text="Campos que só aparecem se esta opção for escolhida"
930
+ ))
931
+ ], label="Opção com Ação"))
932
+ ],
933
+ label="Opções e Ramificações",
934
+ help_text="Configure o que acontece para cada opção"
935
+ )
936
+
937
+ class Meta:
938
+ icon = "list-ul"
939
+ label = "🔗 Campo Condicional - Condicional"
940
+
941
+
942
+
943
+
944
+
945
+
732
946
  FORM_FIELD_BLOCKS = BASE_FORM_FIELD_BLOCKS + [
733
947
  ('checkbox_multi_redirect_field', CheckboxMultiRedirectFieldBlock()),
734
- ('conditional_field', ConditionalFieldBlock()),
948
+ ('conditional_field', ConditionalFieldBlock()),
949
+ ('conditional_field_condicional', ConditionalFieldBlockCondicional()),
950
+ ('section_divider', SectionDividerBlock()),
951
+ ('smart_navigation_field', SmartNavigationFieldBlock()),
952
+ ('section_header', SectionHeaderBlock()),
953
+ ('text_field', TextFieldBlock()),
954
+ ('email_field', EmailFieldBlock()),
955
+ ('cpf_field', CPFFieldBlock()),
956
+ ('cnpj_field', CNPJFieldBlock()),
957
+ ('phone_field', PhoneFieldBlock()),
958
+ ('textarea_field', TextAreaFieldBlock()),
959
+ ('number_field', NumberFieldBlock()),
960
+ ('date_field', DateFieldBlock()),
961
+ ('dropdown_field', DropdownFieldBlock()),
962
+ ('estado_cidade_field', EstadoCidadeFieldBlock()),
963
+ ('radio_field', RadioFieldBlock()),
964
+ ('checkbox_field', CheckboxFieldBlock()),
965
+ ('checkbox_multiple_field', CheckboxMultipleFieldBlock()),
966
+ ('file_upload_field', FileUploadFieldBlock()),
967
+ ('rating_field', RatingFieldBlock()),
968
+ ('info_text', InfoTextBlock()),
969
+ ('divider', DividerBlock()),
970
+ ('nome_completo_field', NomeCompletoFieldBlock()),
735
971
  ]
736
972
 
973
+
974
+
737
975
  class FormStepBlock(StructBlock):
738
976
  """Bloco para uma etapa do formulário - apenas logo e campos"""
739
977
 
@@ -1015,8 +1253,6 @@ class FormularioPage(Page):
1015
1253
  steps.append(step_data)
1016
1254
  return steps
1017
1255
 
1018
-
1019
-
1020
1256
  def get_total_steps(self):
1021
1257
  """Retorna o número total de etapas (incluindo boas-vindas e sucesso)"""
1022
1258
  return len(self.form_steps) + 2 # +2 para boas-vindas e sucesso
@@ -1193,6 +1429,61 @@ class FormularioPage(Page):
1193
1429
 
1194
1430
  return True
1195
1431
 
1432
+ def get_section_map(self):
1433
+ """Cria mapa de seções para navegação"""
1434
+ section_map = {}
1435
+ current_section = None
1436
+
1437
+ for step in self.get_all_steps():
1438
+ for block in step['fields']:
1439
+ if block.block_type == 'section_divider':
1440
+ section_name = block.value['section_name']
1441
+ section_map[section_name] = {
1442
+ 'step': step['number'],
1443
+ 'block_id': block.id,
1444
+ 'title': block.value['title'],
1445
+ 'hidden_by_default': block.value.get('is_hidden_by_default', False)
1446
+ }
1447
+
1448
+ return section_map
1449
+
1450
+ def get_navigation_data(self):
1451
+ """Coleta dados de navegação de todos os campos inteligentes"""
1452
+ navigation_data = {}
1453
+
1454
+ for step in self.get_all_steps():
1455
+ for block in step['fields']:
1456
+ if block.block_type == 'smart_navigation_field':
1457
+ field_id = f"smart_navigation_field_{block.id}"
1458
+ options_data = {}
1459
+
1460
+ for option in block.value.get('navigation_options', []):
1461
+ options_data[option.value['value']] = {
1462
+ 'action_type': option.value['action_type'],
1463
+ 'target_section': option.value.get('target_section_name', ''),
1464
+ 'finish_message': option.value.get('finish_message', ''),
1465
+ 'thank_you_title': option.value.get('custom_thank_you_title', '')
1466
+ }
1467
+
1468
+ navigation_data[field_id] = options_data
1469
+
1470
+ return navigation_data
1471
+
1472
+ def get_context(self, request, *args, **kwargs):
1473
+ """Adiciona dados de navegação ao contexto"""
1474
+ context = super().get_context(request, *args, **kwargs)
1475
+
1476
+ # Dados existentes
1477
+ context['total_form_steps'] = len(self.form_steps)
1478
+ context['all_steps'] = self.get_all_steps()
1479
+
1480
+ # Novos dados de navegação
1481
+ context['section_map'] = self.get_section_map()
1482
+ context['navigation_data'] = self.get_navigation_data()
1483
+ context['section_map_json'] = json.dumps(self.get_section_map())
1484
+ context['navigation_data_json'] = json.dumps(self.get_navigation_data())
1485
+
1486
+ return context
1196
1487
 
1197
1488
 
1198
1489
  # def get_estados_cidades_data(self):