Inhalt

Aktueller Ordner: duesseldorfer-schuelerinventar-freepascal-client
⬅ Übergeordnet

u_profileedit.pas

unit u_profileedit;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
  ComCtrls, fpjson, u_api, u_norms;

type

  { TProfileEditForm }

  TProfileEditForm = class(TForm)
    btnSave: TButton;
    btnCancel: TButton;
    edtName: TEdit;
    Label1: TLabel;
    LabelGroup: TLabel;
    cboGroup: TComboBox;
    edtNewGroup: TEdit;
    LabelNewGroup: TLabel;
    PageControl1: TPageControl;
    TabSE: TTabSheet;
    TabFE: TTabSheet;
    ScrollBoxSE: TScrollBox;
    ScrollBoxFE: TScrollBox;
  private
    FUserID: string;
    FSession: string;
    FProfileID: string;
    FGroups: TJSONArray;
    FSEValues: array[1..36] of TRadioGroup;
    FFEValues: array[1..36] of TRadioGroup;
    procedure LoadGroups;
    procedure CreateItemControls;
    procedure LoadProfileData;
    procedure SaveProfile;
    procedure OnSaveClick(Sender: TObject);
    procedure OnCancelClick(Sender: TObject);
  public
    constructor Create(AOwner: TComponent; const UserID, Session: string; ProfileID: string = ''); reintroduce;
  end;

implementation

{$R *.lfm}

{ TProfileEditForm }

constructor TProfileEditForm.Create(AOwner: TComponent; const UserID, Session: string; ProfileID: string);
begin
  inherited Create(AOwner);
  FUserID := UserID;
  FSession := Session;
  FProfileID := ProfileID;
  if ProfileID = '' then
    Caption := 'Neues Profil'
  else
    Caption := 'Profil bearbeiten';
  Width := 950;
  Height := 750;
  Position := poScreenCenter;
  
  ShowMessage('ProfileEditForm.Create: ProfileID=' + ProfileID);
  
  // Buttons manuell verbinden
  btnSave.OnClick := @OnSaveClick;
  btnCancel.OnClick := @OnCancelClick;
  
  LoadGroups;
  CreateItemControls;
  if FProfileID <> '' then
    LoadProfileData;
end;

procedure TProfileEditForm.LoadGroups;
var
  i: Integer;
  Group: TJSONObject;
  GroupName: string;
begin
  ShowMessage('LoadGroups: Start');
  FGroups := GetGroups(FUserID, FSession);
  cboGroup.Items.Clear;
  if Assigned(FGroups) then
  begin
    ShowMessage('LoadGroups: Anzahl Gruppen=' + IntToStr(FGroups.Count));
    for i := 0 to FGroups.Count - 1 do
    begin
      Group := TJSONObject(FGroups.Objects[i]);
      GroupName := Group.Get('name', '');
      if GroupName <> '' then
      begin
        cboGroup.Items.Add(GroupName);
        ShowMessage('LoadGroups: Gruppe ' + IntToStr(i) + ' = ' + GroupName);
      end;
    end;
  end
  else
    ShowMessage('LoadGroups: Keine Gruppen gefunden');
    
  if cboGroup.Items.Count > 0 then
    cboGroup.ItemIndex := 0;
  ShowMessage('LoadGroups: Ende');
end;

procedure TProfileEditForm.CreateItemControls;
var
  i: Integer;
  GroupBox: TGroupBox;
  rg: TRadioGroup;
begin
  ShowMessage('CreateItemControls: Start');
  for i := 1 to 36 do
  begin
    // SE
    GroupBox := TGroupBox.Create(ScrollBoxSE);
    GroupBox.Parent := ScrollBoxSE;
    GroupBox.Caption := Format('%d. %s', [i, ITEMS[i]]);
    GroupBox.Top := (i - 1) * 70 + 5;
    GroupBox.Left := 5;
    GroupBox.Width := ScrollBoxSE.Width - 20;
    GroupBox.Height := 65;
    
    rg := TRadioGroup.Create(GroupBox);
    rg.Parent := GroupBox;
    rg.SetBounds(5, 15, GroupBox.Width - 10, 40);
    rg.Columns := 4;
    rg.Items.Add('trifft voll zu (4)');
    rg.Items.Add('trifft zu (3)');
    rg.Items.Add('trifft teilweise zu (2)');
    rg.Items.Add('trifft nicht zu (1)');
    rg.ItemIndex := 2;
    FSEValues[i] := rg;
    
    // FE
    GroupBox := TGroupBox.Create(ScrollBoxFE);
    GroupBox.Parent := ScrollBoxFE;
    GroupBox.Caption := Format('%d. %s', [i, ITEMS[i]]);
    GroupBox.Top := (i - 1) * 70 + 5;
    GroupBox.Left := 5;
    GroupBox.Width := ScrollBoxFE.Width - 20;
    GroupBox.Height := 65;
    
    rg := TRadioGroup.Create(GroupBox);
    rg.Parent := GroupBox;
    rg.SetBounds(5, 15, GroupBox.Width - 10, 40);
    rg.Columns := 4;
    rg.Items.Add('trifft voll zu (4)');
    rg.Items.Add('trifft zu (3)');
    rg.Items.Add('trifft teilweise zu (2)');
    rg.Items.Add('trifft nicht zu (1)');
    rg.ItemIndex := 2;
    FFEValues[i] := rg;
  end;
  ShowMessage('CreateItemControls: Ende');
end;

procedure TProfileEditForm.LoadProfileData;
var
  ProfileData: TJSONObject;
  i: Integer;
  GroupName: string;
begin
  ShowMessage('LoadProfileData: Start für ID ' + FProfileID);
  ProfileData := GetProfile(FUserID, FSession, FProfileID);
  if Assigned(ProfileData) then
  begin
    ShowMessage('LoadProfileData: Profil geladen');
    edtName.Text := ProfileData.Get('name', '');
    ShowMessage('LoadProfileData: Name=' + edtName.Text);
    
    GroupName := ProfileData.Get('gruppename', '');
    ShowMessage('LoadProfileData: Gruppe=' + GroupName);
    if GroupName <> '' then
      cboGroup.Text := GroupName;
    
    for i := 1 to 36 do
    begin
      if FSEValues[i] <> nil then
        FSEValues[i].ItemIndex := ProfileData.Get('item' + IntToStr(i), 2) - 1;
      if FFEValues[i] <> nil then
        FFEValues[i].ItemIndex := ProfileData.Get('feitem' + IntToStr(i), 2) - 1;
    end;
    ShowMessage('LoadProfileData: Items geladen');
    ProfileData.Free;
  end
  else
    ShowMessage('LoadProfileData: Profil nicht gefunden');
  ShowMessage('LoadProfileData: Ende');
end;

procedure TProfileEditForm.OnSaveClick(Sender: TObject);
begin
  ShowMessage('OnSaveClick: Start');
  SaveProfile;
end;

procedure TProfileEditForm.OnCancelClick(Sender: TObject);
begin
  ModalResult := mrCancel;
end;

procedure TProfileEditForm.SaveProfile;
var
  Data: TJSONObject;
  i: Integer;
  GroupID: Integer;
  GroupName: string;
begin
  ShowMessage('SaveProfile: Start');
  if Trim(edtName.Text) = '' then
  begin
    ShowMessage('Bitte Name eingeben');
    Exit;
  end;
  
  Data := TJSONObject.Create;
  try
    Data.Add('name', edtName.Text);
    
    // Gruppe bestimmen
    GroupName := Trim(edtNewGroup.Text);
    ShowMessage('SaveProfile: GroupName=' + GroupName);
    if GroupName <> '' then
    begin
      Data.Add('namegruppe', GroupName);
      ShowMessage('SaveProfile: Neue Gruppe wird erstellt');
    end
    else if cboGroup.Text <> '' then
    begin
      GroupName := cboGroup.Text;
      GroupID := 0;
      if Assigned(FGroups) then
      begin
        for i := 0 to FGroups.Count - 1 do
        begin
          if TJSONObject(FGroups.Objects[i]).Get('name', '') = GroupName then
          begin
            GroupID := TJSONObject(FGroups.Objects[i]).Get('gruppeID', 0);
            Break;
          end;
        end;
      end;
      if GroupID > 0 then
      begin
        Data.Add('gruppeID', GroupID);
        ShowMessage('SaveProfile: Bestehende Gruppe ID=' + IntToStr(GroupID));
      end;
    end;
    
    for i := 1 to 36 do
    begin
      if FSEValues[i] <> nil then
        Data.Add('item' + IntToStr(i), FSEValues[i].ItemIndex + 1)
      else
        Data.Add('item' + IntToStr(i), 2);
      if FFEValues[i] <> nil then
        Data.Add('feitem' + IntToStr(i), FFEValues[i].ItemIndex + 1)
      else
        Data.Add('feitem' + IntToStr(i), 2);
    end;
    
    if FProfileID <> '' then
    begin
      Data.Add('profilID', StrToInt(FProfileID));
      ShowMessage('SaveProfile: Update vorhandenes Profil');
      if UpdateProfile(FUserID, FSession, Data) then
      begin
        ShowMessage('SaveProfile: Update erfolgreich');
        ModalResult := mrOk;
      end
      else
        ShowMessage('Fehler beim Speichern');
    end
    else
    begin
      ShowMessage('SaveProfile: Neues Profil erstellen');
      if CreateProfile(FUserID, FSession, Data) then
      begin
        ShowMessage('SaveProfile: Erstellen erfolgreich');
        ModalResult := mrOk;
      end
      else
        ShowMessage('Fehler beim Erstellen');
    end;
  finally
    Data.Free;
  end;
  ShowMessage('SaveProfile: Ende');
end;

end.