github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/client/GUI/onglets/equipiers.go (about)

     1  package onglets
     2  
     3  import (
     4  	"fmt"
     5  
     6  	dm "github.com/benoitkugler/goACVE/server/core/datamodel"
     7  
     8  	"github.com/therecipe/qt/core"
     9  
    10  	"github.com/benoitkugler/goACVE/client/GUI/fields"
    11  
    12  	"github.com/benoitkugler/goACVE/client/GUI/basic"
    13  	"github.com/benoitkugler/goACVE/client/GUI/common"
    14  	"github.com/benoitkugler/goACVE/client/GUI/lists"
    15  	"github.com/benoitkugler/goACVE/client/controllers"
    16  	rd "github.com/benoitkugler/goACVE/server/core/rawdata"
    17  	"github.com/therecipe/qt/widgets"
    18  )
    19  
    20  func (e *Equipiers) Render() {
    21  	e.liste.Model().SetData(e.controller.Liste)
    22  	e.liste.SetSearch(e.controller.Etat.Recherche)
    23  	if e.controller.Etat.EquipierCurrent != nil {
    24  		e.liste.SelectRow(e.controller.Etat.EquipierCurrent)
    25  	}
    26  	e.renderSimilaires()
    27  
    28  	var op rd.OptionnalId
    29  	if e.controller.Etat.CritereCamp != nil {
    30  		op = rd.NewOptionnalId(e.controller.Etat.CritereCamp.Id)
    31  	}
    32  	e.camp.Update()
    33  	e.camp.SetData(op)
    34  	e.temporaire.SetData(e.controller.Etat.CritereTemporaire)
    35  
    36  	e.stats.SetData(e.controller.GetStats())
    37  }
    38  
    39  func (e *Equipiers) renderSimilaires() {
    40  	var in rd.Personne
    41  	if id := e.controller.Etat.EquipierCurrent; id != nil {
    42  		equipier := e.controller.Base.NewEquipier(id.Int64())
    43  		in = equipier.GetPersonne().RawData()
    44  	}
    45  	e.similaires.SetData(in.BasePersonne, bool(in.IsTemporaire))
    46  	e.similaires.SetEnabled(bool(in.IsTemporaire) && e.controller.EditRight)
    47  }
    48  
    49  func (Equipiers) ChoixEviteDoublonsDocuments(docs []dm.AccesDocumentPersonne) (toSupp rd.Ids) {
    50  	return common.ChoixEviteDoublonsDocuments(docs)
    51  }
    52  
    53  func (e *Equipiers) ConfirmeSupprimeEquipier(part rd.Personne) bool {
    54  	msg := fmt.Sprintf("Etes-vous sur de vouloir supprimer l'équipier <b>%s</b>?<br/>", part.NomPrenom())
    55  	return basic.Confirmation(msg, "Supprimer", basic.ONDelete)
    56  }
    57  
    58  type Equipiers struct {
    59  	*widgets.QFrame
    60  	controller *controllers.Equipiers
    61  	parent     *widgets.QTabWidget
    62  	toolbar    *widgets.QToolBar
    63  
    64  	liste      lists.Table
    65  	similaires *common.Similaires
    66  	camp       fields.Camp
    67  	temporaire fields.OptionnalBool
    68  	stats      common.Statistics
    69  }
    70  
    71  func newEquipiers(ct *controllers.Equipiers) *Equipiers {
    72  	p := Equipiers{QFrame: basic.Frame(), controller: ct}
    73  	p.liste = lists.Table{
    74  		Liste: lists.Liste{
    75  			Headers: ct.Header,
    76  			OnClick: func(acces rd.Item, _ int) {
    77  				ct.Etat.EquipierCurrent = acces.Id
    78  				p.UpdateToolbar()
    79  				p.renderSimilaires()
    80  			},
    81  			OnRightClick: func(acces rd.Item, pos *core.QPoint) {
    82  				eq := ct.Base.NewEquipier(acces.Id.Int64())
    83  				accesPers := eq.GetPersonne()
    84  				if accesPers.RawData().IsTemporaire {
    85  					return
    86  				}
    87  				menu := widgets.NewQMenu(p.liste)
    88  				ac := menu.AddAction("Aller à la personne")
    89  				ac.ConnectTriggered(func(_ bool) {
    90  					ct.Main().Controllers.Personnes.SelectPersonne(accesPers)
    91  				})
    92  				p.liste.ShowContextMenu(menu, pos)
    93  			},
    94  			OnDoubleClick: func(acces rd.Item, _ int) {
    95  				p.editEquipier(acces)
    96  			},
    97  			OnSearch: func(pattern string) {
    98  				ct.Etat.Recherche = pattern
    99  				ct.Reset()
   100  			},
   101  			OnSort: func(field rd.Field, reverse bool) {
   102  				lists.DefaultSort(p.liste, field, reverse)
   103  			},
   104  		},
   105  	}
   106  	p.liste.Init()
   107  	p.similaires = common.NewSimilaires(ct.Base, p.controller.IdentifieTmp)
   108  	p.stats = common.NewStatistics(true)
   109  	p.camp = fields.NewCamp(true, ct.Base, true)
   110  	p.camp.ShowTerminated(false)
   111  	p.camp.ConnectActivated(func(_ int) {
   112  		ct.Etat.CritereCamp = p.camp.GetData()
   113  		ct.Reset()
   114  	})
   115  	showTerminated := widgets.NewQCheckBox2("Afficher les camps terminés", nil)
   116  	showTerminated.ConnectClicked(p.camp.ShowTerminated)
   117  
   118  	p.temporaire = fields.NewOptionnalBool(true, "Temporaires", "Référencés")
   119  	p.temporaire.ConnectCurrentIndexChanged(func(_ int) {
   120  		ct.Etat.CritereTemporaire = p.temporaire.GetData()
   121  		ct.Reset()
   122  	})
   123  
   124  	row := widgets.NewQHBoxLayout()
   125  	row.AddWidget(basic.Label("Choix du camp"), 1, 0)
   126  	row.AddWidget(p.camp, 1, 0)
   127  	row.AddWidget(showTerminated, 1, 0)
   128  	row.AddStretch(3)
   129  	row.AddWidget(basic.Label("Statut des participants"), 1, 0)
   130  	row.AddWidget(p.temporaire, 1, 0)
   131  
   132  	lay := widgets.NewQVBoxLayout2(p)
   133  	lay.AddWidget(p.stats, 0, 0)
   134  	lay.AddLayout(row, 0)
   135  	lay.AddWidget(p.liste, 3, 0)
   136  	lay.AddWidget(p.similaires, 2, 0)
   137  	return &p
   138  }
   139  
   140  func (e *Equipiers) creer() {
   141  	camp := e.controller.Etat.CritereCamp
   142  	var id rd.OptionnalId
   143  	if camp != nil {
   144  		id = rd.NewOptionnalId(camp.Id)
   145  	}
   146  	participant := CreeEquipier(e.controller.Base, id)
   147  	if participant == nil {
   148  		return
   149  	}
   150  	e.controller.CreateEquipier(*participant)
   151  }
   152  
   153  func (e *Equipiers) supprimer() {
   154  	e.controller.SupprimeEquipier()
   155  }
   156  
   157  func (e *Equipiers) exporter() {
   158  	path := e.controller.ExportEquipiers()
   159  	if path != "" {
   160  		basic.ShowFile(path)
   161  	}
   162  }
   163  
   164  func (e *Equipiers) editEquipier(acces rd.Item) {
   165  	eq := e.controller.Base.NewEquipier(acces.Id.Int64())
   166  	if eq.GetPersonne().RawData().IsTemporaire {
   167  		basic.Confirmation("Cet équipier n'est pas encore référencé."+
   168  			" <br/>Veuillez l'<b>identifier</b> pour accéder à ses détails.", "Ok", "")
   169  		return
   170  	}
   171  	modif := EditEquipier(e.controller.Base, e.controller.EditRight, eq.RawData(),
   172  		rd.NewOptionnalId(eq.RawData().IdPersonne),
   173  		rd.NewOptionnalId(eq.RawData().IdCamp),
   174  	)
   175  	if modif == nil {
   176  		return
   177  	}
   178  	e.controller.UpdateEquipier(*modif)
   179  }
   180  
   181  // CreeEquipier propose la création d'un participant avec un rôle Equipe.
   182  // En cas d'annulation, out vaut `nil`
   183  func CreeEquipier(base *dm.BaseLocale, idCamp rd.OptionnalId) *rd.Equipier {
   184  	return EditEquipier(base, true, rd.Equipier{
   185  		Roles: rd.RAnimation.AsRoles(),
   186  	}, rd.OptionnalId{}, idCamp)
   187  }
   188  
   189  func EditEquipier(base *dm.BaseLocale, editable bool, participant rd.Equipier,
   190  	idPersonne rd.OptionnalId, idCamp rd.OptionnalId) *rd.Equipier {
   191  	d := common.NewFicheEquipier(base, editable)
   192  	d.ActiveCamp(idCamp.IsNil())
   193  	d.SetData(participant, idPersonne, idCamp)
   194  	dialog := common.NewDetails(&d, editable)
   195  	if dialog.Exec() == 0 {
   196  		return nil
   197  	}
   198  	part := d.GetData()
   199  	return &part
   200  }