diff --git a/.gitignore b/.gitignore index b8bff3c0a2646500944e4df452535a083981997f..eea4451178adce2069e5464d4a4dfa482a1cdc96 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,5 @@ files/**/* !files/.gitkeep .idea +.DS_Store + diff --git a/README.md b/README.md index 8fb7fd92f486b903940ec63f7e3d55246657a008..8ac192c0e29e6fca76a09ae5728528447b1ad17c 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,11 @@ HARMONY and EIFFEL. The project is in active development. For a simple development environment, consult [docker/dev](docker/dev/README.md). +<<<<<<< HEAD <<<<<<< HEAD ======= This is a Test >>>>>>> TeamProjectmanagement +======= +//test +>>>>>>> Teamprojectoverview diff --git a/config/auth.toml b/config/auth.toml index 4a738ec7f1dd766d4f5bdd0135908c40b7f70356..352ad28348c7fb08063d7c8ff5651ed6a4b2c36e 100644 --- a/config/auth.toml +++ b/config/auth.toml @@ -7,8 +7,8 @@ display_name = "GitHub" authorize_uri = "https://github.com/login/oauth/authorize" access_token_uri = "https://github.com/login/oauth/access_token" userinfo_uri = "https://api.github.com/user" -client_id = "Ov23liwqVDKeBaIHmBfZ" -client_secret = "513b5408f5d19e5bf30cef7201e25d1056923e4f" +client_id = "Ov23liDARHzTNU4Ol0yI" +client_secret = "f339af58456bb9f1874245f98027e45458489a69" scopes = ["read:user", "user:email"] [provider.google] diff --git a/node_modules/@popperjs/core/dist/cjs/enums.js b/node_modules/@popperjs/core 2/dist/cjs/enums.js similarity index 100% rename from node_modules/@popperjs/core/dist/cjs/enums.js rename to node_modules/@popperjs/core 2/dist/cjs/enums.js diff --git a/node_modules/@popperjs/core/dist/cjs/enums.js.flow b/node_modules/@popperjs/core 2/dist/cjs/enums.js.flow similarity index 100% rename from node_modules/@popperjs/core/dist/cjs/enums.js.flow rename to node_modules/@popperjs/core 2/dist/cjs/enums.js.flow diff --git a/node_modules/@popperjs/core/dist/cjs/enums.js.map b/node_modules/@popperjs/core 2/dist/cjs/enums.js.map similarity index 100% rename from node_modules/@popperjs/core/dist/cjs/enums.js.map rename to node_modules/@popperjs/core 2/dist/cjs/enums.js.map diff --git a/node_modules/@popperjs/core/dist/cjs/popper-base.js b/node_modules/@popperjs/core 2/dist/cjs/popper-base.js similarity index 100% rename from node_modules/@popperjs/core/dist/cjs/popper-base.js rename to node_modules/@popperjs/core 2/dist/cjs/popper-base.js diff --git a/node_modules/@popperjs/core/dist/cjs/popper-base.js.flow b/node_modules/@popperjs/core 2/dist/cjs/popper-base.js.flow similarity index 100% rename from node_modules/@popperjs/core/dist/cjs/popper-base.js.flow rename to node_modules/@popperjs/core 2/dist/cjs/popper-base.js.flow diff --git a/node_modules/@popperjs/core/dist/cjs/popper-base.js.map b/node_modules/@popperjs/core 2/dist/cjs/popper-base.js.map similarity index 100% rename from node_modules/@popperjs/core/dist/cjs/popper-base.js.map rename to node_modules/@popperjs/core 2/dist/cjs/popper-base.js.map diff --git a/node_modules/@popperjs/core/dist/cjs/popper-lite.js b/node_modules/@popperjs/core 2/dist/cjs/popper-lite.js similarity index 100% rename from node_modules/@popperjs/core/dist/cjs/popper-lite.js rename to node_modules/@popperjs/core 2/dist/cjs/popper-lite.js diff --git a/node_modules/@popperjs/core/dist/cjs/popper-lite.js.flow b/node_modules/@popperjs/core 2/dist/cjs/popper-lite.js.flow similarity index 100% rename from node_modules/@popperjs/core/dist/cjs/popper-lite.js.flow rename to node_modules/@popperjs/core 2/dist/cjs/popper-lite.js.flow diff --git a/node_modules/@popperjs/core/dist/cjs/popper-lite.js.map b/node_modules/@popperjs/core 2/dist/cjs/popper-lite.js.map similarity index 100% rename from node_modules/@popperjs/core/dist/cjs/popper-lite.js.map rename to node_modules/@popperjs/core 2/dist/cjs/popper-lite.js.map diff --git a/node_modules/@popperjs/core/dist/cjs/popper.js b/node_modules/@popperjs/core 2/dist/cjs/popper.js similarity index 100% rename from node_modules/@popperjs/core/dist/cjs/popper.js rename to node_modules/@popperjs/core 2/dist/cjs/popper.js diff --git a/node_modules/@popperjs/core/dist/cjs/popper.js.flow b/node_modules/@popperjs/core 2/dist/cjs/popper.js.flow similarity index 100% rename from node_modules/@popperjs/core/dist/cjs/popper.js.flow rename to node_modules/@popperjs/core 2/dist/cjs/popper.js.flow diff --git a/node_modules/@popperjs/core/dist/cjs/popper.js.map b/node_modules/@popperjs/core 2/dist/cjs/popper.js.map similarity index 100% rename from node_modules/@popperjs/core/dist/cjs/popper.js.map rename to node_modules/@popperjs/core 2/dist/cjs/popper.js.map diff --git a/node_modules/@popperjs/core/dist/umd/enums.js b/node_modules/@popperjs/core 2/dist/umd/enums.js similarity index 100% rename from node_modules/@popperjs/core/dist/umd/enums.js rename to node_modules/@popperjs/core 2/dist/umd/enums.js diff --git a/node_modules/@popperjs/core/dist/umd/enums.js.map b/node_modules/@popperjs/core 2/dist/umd/enums.js.map similarity index 100% rename from node_modules/@popperjs/core/dist/umd/enums.js.map rename to node_modules/@popperjs/core 2/dist/umd/enums.js.map diff --git a/node_modules/@popperjs/core/dist/umd/enums.min.js b/node_modules/@popperjs/core 2/dist/umd/enums.min.js similarity index 100% rename from node_modules/@popperjs/core/dist/umd/enums.min.js rename to node_modules/@popperjs/core 2/dist/umd/enums.min.js diff --git a/node_modules/@popperjs/core/dist/umd/enums.min.js.flow b/node_modules/@popperjs/core 2/dist/umd/enums.min.js.flow similarity index 100% rename from node_modules/@popperjs/core/dist/umd/enums.min.js.flow rename to node_modules/@popperjs/core 2/dist/umd/enums.min.js.flow diff --git a/node_modules/@popperjs/core/dist/umd/enums.min.js.map b/node_modules/@popperjs/core 2/dist/umd/enums.min.js.map similarity index 100% rename from node_modules/@popperjs/core/dist/umd/enums.min.js.map rename to node_modules/@popperjs/core 2/dist/umd/enums.min.js.map diff --git a/node_modules/@popperjs/core/dist/umd/popper-base.js b/node_modules/@popperjs/core 2/dist/umd/popper-base.js similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper-base.js rename to node_modules/@popperjs/core 2/dist/umd/popper-base.js diff --git a/node_modules/@popperjs/core/dist/umd/popper-base.js.map b/node_modules/@popperjs/core 2/dist/umd/popper-base.js.map similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper-base.js.map rename to node_modules/@popperjs/core 2/dist/umd/popper-base.js.map diff --git a/node_modules/@popperjs/core/dist/umd/popper-base.min.js b/node_modules/@popperjs/core 2/dist/umd/popper-base.min.js similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper-base.min.js rename to node_modules/@popperjs/core 2/dist/umd/popper-base.min.js diff --git a/node_modules/@popperjs/core/dist/umd/popper-base.min.js.flow b/node_modules/@popperjs/core 2/dist/umd/popper-base.min.js.flow similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper-base.min.js.flow rename to node_modules/@popperjs/core 2/dist/umd/popper-base.min.js.flow diff --git a/node_modules/@popperjs/core/dist/umd/popper-base.min.js.map b/node_modules/@popperjs/core 2/dist/umd/popper-base.min.js.map similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper-base.min.js.map rename to node_modules/@popperjs/core 2/dist/umd/popper-base.min.js.map diff --git a/node_modules/@popperjs/core/dist/umd/popper-lite.js b/node_modules/@popperjs/core 2/dist/umd/popper-lite.js similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper-lite.js rename to node_modules/@popperjs/core 2/dist/umd/popper-lite.js diff --git a/node_modules/@popperjs/core/dist/umd/popper-lite.js.map b/node_modules/@popperjs/core 2/dist/umd/popper-lite.js.map similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper-lite.js.map rename to node_modules/@popperjs/core 2/dist/umd/popper-lite.js.map diff --git a/node_modules/@popperjs/core/dist/umd/popper-lite.min.js b/node_modules/@popperjs/core 2/dist/umd/popper-lite.min.js similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper-lite.min.js rename to node_modules/@popperjs/core 2/dist/umd/popper-lite.min.js diff --git a/node_modules/@popperjs/core/dist/umd/popper-lite.min.js.flow b/node_modules/@popperjs/core 2/dist/umd/popper-lite.min.js.flow similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper-lite.min.js.flow rename to node_modules/@popperjs/core 2/dist/umd/popper-lite.min.js.flow diff --git a/node_modules/@popperjs/core/dist/umd/popper-lite.min.js.map b/node_modules/@popperjs/core 2/dist/umd/popper-lite.min.js.map similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper-lite.min.js.map rename to node_modules/@popperjs/core 2/dist/umd/popper-lite.min.js.map diff --git a/node_modules/@popperjs/core/dist/umd/popper.js b/node_modules/@popperjs/core 2/dist/umd/popper.js similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper.js rename to node_modules/@popperjs/core 2/dist/umd/popper.js diff --git a/node_modules/@popperjs/core/dist/umd/popper.js.map b/node_modules/@popperjs/core 2/dist/umd/popper.js.map similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper.js.map rename to node_modules/@popperjs/core 2/dist/umd/popper.js.map diff --git a/node_modules/@popperjs/core/dist/umd/popper.min.js b/node_modules/@popperjs/core 2/dist/umd/popper.min.js similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper.min.js rename to node_modules/@popperjs/core 2/dist/umd/popper.min.js diff --git a/node_modules/@popperjs/core/dist/umd/popper.min.js.flow b/node_modules/@popperjs/core 2/dist/umd/popper.min.js.flow similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper.min.js.flow rename to node_modules/@popperjs/core 2/dist/umd/popper.min.js.flow diff --git a/node_modules/@popperjs/core/dist/umd/popper.min.js.map b/node_modules/@popperjs/core 2/dist/umd/popper.min.js.map similarity index 100% rename from node_modules/@popperjs/core/dist/umd/popper.min.js.map rename to node_modules/@popperjs/core 2/dist/umd/popper.min.js.map diff --git a/node_modules/@popperjs/core/lib/modifiers/applyStyles.d.ts b/node_modules/@popperjs/core 2/lib/modifiers/applyStyles.d.ts similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/applyStyles.d.ts rename to node_modules/@popperjs/core 2/lib/modifiers/applyStyles.d.ts diff --git a/node_modules/@popperjs/core/lib/modifiers/applyStyles.js b/node_modules/@popperjs/core 2/lib/modifiers/applyStyles.js similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/applyStyles.js rename to node_modules/@popperjs/core 2/lib/modifiers/applyStyles.js diff --git a/node_modules/@popperjs/core/lib/modifiers/applyStyles.js.flow b/node_modules/@popperjs/core 2/lib/modifiers/applyStyles.js.flow similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/applyStyles.js.flow rename to node_modules/@popperjs/core 2/lib/modifiers/applyStyles.js.flow diff --git a/node_modules/@popperjs/core/lib/modifiers/arrow.d.ts b/node_modules/@popperjs/core 2/lib/modifiers/arrow.d.ts similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/arrow.d.ts rename to node_modules/@popperjs/core 2/lib/modifiers/arrow.d.ts diff --git a/node_modules/@popperjs/core/lib/modifiers/arrow.js b/node_modules/@popperjs/core 2/lib/modifiers/arrow.js similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/arrow.js rename to node_modules/@popperjs/core 2/lib/modifiers/arrow.js diff --git a/node_modules/@popperjs/core/lib/modifiers/arrow.js.flow b/node_modules/@popperjs/core 2/lib/modifiers/arrow.js.flow similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/arrow.js.flow rename to node_modules/@popperjs/core 2/lib/modifiers/arrow.js.flow diff --git a/node_modules/@popperjs/core/lib/modifiers/computeStyles.d.ts b/node_modules/@popperjs/core 2/lib/modifiers/computeStyles.d.ts similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/computeStyles.d.ts rename to node_modules/@popperjs/core 2/lib/modifiers/computeStyles.d.ts diff --git a/node_modules/@popperjs/core/lib/modifiers/computeStyles.js b/node_modules/@popperjs/core 2/lib/modifiers/computeStyles.js similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/computeStyles.js rename to node_modules/@popperjs/core 2/lib/modifiers/computeStyles.js diff --git a/node_modules/@popperjs/core/lib/modifiers/computeStyles.js.flow b/node_modules/@popperjs/core 2/lib/modifiers/computeStyles.js.flow similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/computeStyles.js.flow rename to node_modules/@popperjs/core 2/lib/modifiers/computeStyles.js.flow diff --git a/node_modules/@popperjs/core/lib/modifiers/eventListeners.d.ts b/node_modules/@popperjs/core 2/lib/modifiers/eventListeners.d.ts similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/eventListeners.d.ts rename to node_modules/@popperjs/core 2/lib/modifiers/eventListeners.d.ts diff --git a/node_modules/@popperjs/core/lib/modifiers/eventListeners.js b/node_modules/@popperjs/core 2/lib/modifiers/eventListeners.js similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/eventListeners.js rename to node_modules/@popperjs/core 2/lib/modifiers/eventListeners.js diff --git a/node_modules/@popperjs/core/lib/modifiers/eventListeners.js.flow b/node_modules/@popperjs/core 2/lib/modifiers/eventListeners.js.flow similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/eventListeners.js.flow rename to node_modules/@popperjs/core 2/lib/modifiers/eventListeners.js.flow diff --git a/node_modules/@popperjs/core/lib/modifiers/flip.d.ts b/node_modules/@popperjs/core 2/lib/modifiers/flip.d.ts similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/flip.d.ts rename to node_modules/@popperjs/core 2/lib/modifiers/flip.d.ts diff --git a/node_modules/@popperjs/core/lib/modifiers/flip.js b/node_modules/@popperjs/core 2/lib/modifiers/flip.js similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/flip.js rename to node_modules/@popperjs/core 2/lib/modifiers/flip.js diff --git a/node_modules/@popperjs/core/lib/modifiers/flip.js.flow b/node_modules/@popperjs/core 2/lib/modifiers/flip.js.flow similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/flip.js.flow rename to node_modules/@popperjs/core 2/lib/modifiers/flip.js.flow diff --git a/node_modules/@popperjs/core/lib/modifiers/hide.d.ts b/node_modules/@popperjs/core 2/lib/modifiers/hide.d.ts similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/hide.d.ts rename to node_modules/@popperjs/core 2/lib/modifiers/hide.d.ts diff --git a/node_modules/@popperjs/core/lib/modifiers/hide.js b/node_modules/@popperjs/core 2/lib/modifiers/hide.js similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/hide.js rename to node_modules/@popperjs/core 2/lib/modifiers/hide.js diff --git a/node_modules/@popperjs/core/lib/modifiers/hide.js.flow b/node_modules/@popperjs/core 2/lib/modifiers/hide.js.flow similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/hide.js.flow rename to node_modules/@popperjs/core 2/lib/modifiers/hide.js.flow diff --git a/node_modules/@popperjs/core/lib/modifiers/index.d.ts b/node_modules/@popperjs/core 2/lib/modifiers/index.d.ts similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/index.d.ts rename to node_modules/@popperjs/core 2/lib/modifiers/index.d.ts diff --git a/node_modules/@popperjs/core/lib/modifiers/index.js b/node_modules/@popperjs/core 2/lib/modifiers/index.js similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/index.js rename to node_modules/@popperjs/core 2/lib/modifiers/index.js diff --git a/node_modules/@popperjs/core/lib/modifiers/index.js.flow b/node_modules/@popperjs/core 2/lib/modifiers/index.js.flow similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/index.js.flow rename to node_modules/@popperjs/core 2/lib/modifiers/index.js.flow diff --git a/node_modules/@popperjs/core/lib/modifiers/offset.d.ts b/node_modules/@popperjs/core 2/lib/modifiers/offset.d.ts similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/offset.d.ts rename to node_modules/@popperjs/core 2/lib/modifiers/offset.d.ts diff --git a/node_modules/@popperjs/core/lib/modifiers/offset.js b/node_modules/@popperjs/core 2/lib/modifiers/offset.js similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/offset.js rename to node_modules/@popperjs/core 2/lib/modifiers/offset.js diff --git a/node_modules/@popperjs/core/lib/modifiers/offset.js.flow b/node_modules/@popperjs/core 2/lib/modifiers/offset.js.flow similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/offset.js.flow rename to node_modules/@popperjs/core 2/lib/modifiers/offset.js.flow diff --git a/node_modules/@popperjs/core/lib/modifiers/popperOffsets.d.ts b/node_modules/@popperjs/core 2/lib/modifiers/popperOffsets.d.ts similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/popperOffsets.d.ts rename to node_modules/@popperjs/core 2/lib/modifiers/popperOffsets.d.ts diff --git a/node_modules/@popperjs/core/lib/modifiers/popperOffsets.js b/node_modules/@popperjs/core 2/lib/modifiers/popperOffsets.js similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/popperOffsets.js rename to node_modules/@popperjs/core 2/lib/modifiers/popperOffsets.js diff --git a/node_modules/@popperjs/core/lib/modifiers/popperOffsets.js.flow b/node_modules/@popperjs/core 2/lib/modifiers/popperOffsets.js.flow similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/popperOffsets.js.flow rename to node_modules/@popperjs/core 2/lib/modifiers/popperOffsets.js.flow diff --git a/node_modules/@popperjs/core/lib/modifiers/preventOverflow.d.ts b/node_modules/@popperjs/core 2/lib/modifiers/preventOverflow.d.ts similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/preventOverflow.d.ts rename to node_modules/@popperjs/core 2/lib/modifiers/preventOverflow.d.ts diff --git a/node_modules/@popperjs/core/lib/modifiers/preventOverflow.js b/node_modules/@popperjs/core 2/lib/modifiers/preventOverflow.js similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/preventOverflow.js rename to node_modules/@popperjs/core 2/lib/modifiers/preventOverflow.js diff --git a/node_modules/@popperjs/core/lib/modifiers/preventOverflow.js.flow b/node_modules/@popperjs/core 2/lib/modifiers/preventOverflow.js.flow similarity index 100% rename from node_modules/@popperjs/core/lib/modifiers/preventOverflow.js.flow rename to node_modules/@popperjs/core 2/lib/modifiers/preventOverflow.js.flow diff --git a/src/app/project/handler.go b/src/app/project/handler.go new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/app/project/web.go b/src/app/project/web.go new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/templates/eiffel/_project-collection.go.html b/templates/eiffel/_project-collection.go.html index 9852e9f46cc7fcb124b84c9d32c02a7a1f4b093f..3aef678a9d09f08b8925f78d38fbc35ea8fc0a4b 100644 --- a/templates/eiffel/_project-collection.go.html +++ b/templates/eiffel/_project-collection.go.html @@ -16,7 +16,24 @@ </div> <<<<<<< HEAD +<<<<<<< HEAD +======= ======= +<div class="container text-center"> + <div class="row align-items-start"> + <div class="col"> + Das + </div> + <div class="col"> + Ist + </div> + <div class="col"> + ein Test + </div> + </div> +</div> + +>>>>>>> Teamprojectoverview <form> <div class="mb-3"> <label for="project-id" class="form-label">Projekt-ID</label> diff --git a/templates/project/_detail.go.html b/templates/project/_detail.go.html new file mode 100644 index 0000000000000000000000000000000000000000..5d25f281f199593bb6c822e8ffcf17b5c70c76b0 --- /dev/null +++ b/templates/project/_detail.go.html @@ -0,0 +1,173 @@ +{{ define "project.detail" }} + <div class="container-fluid mt-4"> + + <!-- Project Header Section: Main project information and actions --> + <div class="row mb-4"> + <div class="col"> + <div class="d-flex justify-content-between align-items-start"> + <!-- Left side: Project title and metadata --> + <div> + <!-- Main project name as page heading --> + <h1 class="mb-1">{{ .Data.Project.Name }}</h1> + <!-- Subheading with project ID badge and date range --> + <p class="text-muted mb-0"> + <span class="badge bg-secondary me-2">{{ .Data.Project.ProjectID }}</span> + {{ .Data.Project.StartDate.Format "02.01.2006" }} - {{ .Data.Project.EndDate.Format "02.01.2006" }} + </p> + </div> + + <!-- Right side: Action buttons with dropdown menu --> + <div class="btn-group"> + <!-- Primary edit button using HTMX for seamless navigation --> + <a href="/project/{{ .Data.Project.ID.Hex }}/edit" + hx-boost="true" + hx-target="body" + class="btn btn-outline-primary"> + âœï¸ Bearbeiten + </a> + <!-- Dropdown toggle for additional actions --> + <button class="btn btn-outline-secondary dropdown-toggle dropdown-toggle-split" + data-bs-toggle="dropdown"> + <span class="visually-hidden">Toggle Dropdown</span> + </button> + <!-- Dropdown menu with export and delete options --> + <ul class="dropdown-menu"> + <li><a class="dropdown-item" href="#">📄 Export als JSON</a></li> + <li><a class="dropdown-item" href="#">📄 Export als TXT</a></li> + <li><hr class="dropdown-divider"></li> + <li><a class="dropdown-item text-danger" href="#">ðŸ—‘ï¸ Projekt löschen</a></li> + </ul> + </div> + </div> + </div> + </div> + + <!-- Tab Navigation: Switch between General info and Requirements --> + <ul class="nav nav-tabs mb-4" id="projectTabs" role="tablist"> + <!-- General information tab --> + <li class="nav-item" role="presentation"> + <!-- HTMX loads tab content without full page reload --> + <button class="nav-link {{ if eq .Data.ActiveTab "general" }}active{{ end }}" + hx-get="/project/{{ .Data.Project.ID.Hex }}?tab=general" + hx-target="#tab-content" + hx-push-url="true"> + â„¹ï¸ Allgemein + </button> + </li> + <!-- Requirements tab with count badge --> + <li class="nav-item" role="presentation"> + <button class="nav-link {{ if eq .Data.ActiveTab "requirements" }}active{{ end }}" + hx-get="/project/{{ .Data.Project.ID.Hex }}?tab=requirements" + hx-target="#tab-content" + hx-push-url="true"> + ✅ Anforderungen + <!-- Show requirements count in badge --> + <span class="badge bg-secondary ms-1">{{ .Data.Project.RequirementCount }}</span> + </button> + </li> + </ul> + + <!-- Tab Content Container: Content changes based on active tab --> + <div id="tab-content"> + <!-- Conditionally render tab content based on ActiveTab value --> + {{ if eq .Data.ActiveTab "general" }} + {{ template "project.detail.general" . }} + {{ else if eq .Data.ActiveTab "requirements" }} + {{ template "project.detail.requirements" . }} + {{ end }} + </div> + </div> +{{ end }} + +<!-- General Tab Template: Detailed project information display --> +{{ define "project.detail.general" }} + <div class="row"> + <!-- Left column: Main project details --> + <div class="col-lg-8"> + <div class="card"> + <div class="card-header"> + <h5 class="mb-0">Projektdetails</h5> + </div> + <div class="card-body"> + <!-- Definition list for structured display of project data --> + <dl class="row"> + <!-- Project ID field --> + <dt class="col-sm-3">Projekt-ID:</dt> + <dd class="col-sm-9">{{ .Data.Project.ProjectID }}</dd> + + <!-- Project name field --> + <dt class="col-sm-3">Name:</dt> + <dd class="col-sm-9">{{ .Data.Project.Name }}</dd> + + <!-- Description with fallback for empty descriptions --> + <dt class="col-sm-3">Beschreibung:</dt> + <dd class="col-sm-9"> + {{ if .Data.Project.Description }} + {{ .Data.Project.Description }} + {{ else }} + <em class="text-muted">Keine Beschreibung verfügbar</em> + {{ end }} + </dd> + + <!-- Project timeline information --> + <dt class="col-sm-3">Zeitraum:</dt> + <dd class="col-sm-9"> + {{ .Data.Project.StartDate.Format "02.01.2006" }} - {{ .Data.Project.EndDate.Format "02.01.2006" }} + </dd> + + <!-- Creation timestamp --> + <dt class="col-sm-3">Erstellt:</dt> + <dd class="col-sm-9">{{ .Data.Project.CreatedAt.Format "02.01.2006 15:04" }}</dd> + + <!-- Last update timestamp (only shown if project was updated) --> + {{ if .Data.Project.UpdatedAt }} + <dt class="col-sm-3">Aktualisiert:</dt> + <dd class="col-sm-9">{{ .Data.Project.UpdatedAt.Format "02.01.2006 15:04" }}</dd> + {{ end }} + </dl> + </div> + </div> + </div> + + <!-- Right column: Project statistics and metrics --> + <div class="col-lg-4"> + <div class="card"> + <div class="card-header"> + <h5 class="mb-0">Statistiken</h5> + </div> + <!-- Statistics card showing requirements count --> + <div class="card-body text-center"> + <h3 class="mb-1">{{ .Data.Project.RequirementCount }}</h3> + <small class="text-muted">Anforderungen</small> + </div> + </div> + </div> + </div> +{{ end }} + +<!-- Requirements Tab Template: Requirements management interface --> +{{ define "project.detail.requirements" }} + <div class="requirements-container"> + <!-- Header with title and add new requirement button --> + <div class="d-flex justify-content-between align-items-center mb-3"> + <div> + <!-- Requirements section title with count --> + <h5 class="mb-0">Anforderungen ({{ .Data.Project.RequirementCount }})</h5> + <small class="text-muted">Verwalten Sie alle Anforderungen für dieses Projekt</small> + </div> + <div> + <!-- Link to EIFFEL system for creating new requirements --> + <!-- Passes project ID as parameter for automatic association --> + <a href="/eiffel?project={{ .Data.Project.ProjectID }}" + class="btn btn-primary" + hx-boost="true" + hx-target="body"> + âž• Neue Anforderung + </a> + </div> + </div> + + <!-- Include requirements list partial template --> + {{ template "project.requirements.list" . }} + </div> +{{ end }} \ No newline at end of file diff --git a/templates/project/_form.go.html b/templates/project/_form.go.html new file mode 100644 index 0000000000000000000000000000000000000000..4279202de47224332999269f166e86d0a4928669 --- /dev/null +++ b/templates/project/_form.go.html @@ -0,0 +1,135 @@ +{{ define "project.form" }} + <!-- Determine if this is an edit form or create form --> + {{ $isEdit := .Data.Form.IsEditForm }} + <!-- Set the form action URL based on form type --> + {{ $action := "/project/new" }} + {{ if $isEdit }} + {{ $action = printf "/project/%s" .Data.Form.Project.ID.Hex }} + {{ end }} + + <div class="container mt-4"> + <div class="row justify-content-center"> + <!-- Center the form in a responsive column --> + <div class="col-lg-8"> + <div class="card"> + <!-- Card header with dynamic title based on form type --> + <div class="card-header"> + <h4 class="mb-0"> + {{ if $isEdit }} + Projekt bearbeiten + {{ else }} + Neues Projekt erstellen + {{ end }} + </h4> + </div> + + <div class="card-body"> + <!-- Form with different HTTP methods based on operation type --> + <form {{ if $isEdit }} + hx-put="{{ $action }}" + hx-target=".card" + hx-swap="outerHTML" + {{ else }} + method="post" + action="{{ $action }}" + {{ end }}> + + <!-- Success/Error Message Display Section --> + <!-- Success messages (shown after successful operations) --> + {{ range .Data.Successes }} + <div class="alert alert-success">{{ . }}</div> + {{ end }} + <!-- Validation error messages (shown when form validation fails) --> + {{ range .Data.AllValidationErrors }} + <div class="alert alert-danger">{{ .Error }}</div> + {{ end }} + + <!-- Form Fields Row: Project ID and Name --> + <div class="row"> + <!-- Project ID Field (disabled in edit mode) --> + <div class="col-md-6 mb-3"> + <label for="projectId" class="form-label">Projekt-ID *</label> + <input type="text" + class="form-control" + id="projectId" + name="ProjectID" + placeholder="PRJ-2025-XXX" + value="{{ .Data.Form.Project.ProjectID }}" + {{ if $isEdit }}disabled{{ end }} + required> + </div> + + <!-- Project Name Field (always editable) --> + <div class="col-md-6 mb-3"> + <label for="name" class="form-label">Projektname *</label> + <input type="text" + class="form-control" + id="name" + name="Name" + placeholder="HARMONY Mobile" + value="{{ .Data.Form.Project.Name }}" + required> + </div> + </div> + + <!-- Description Field (full width, optional) --> + <div class="mb-3"> + <label for="description" class="form-label">Beschreibung</label> + <textarea class="form-control" + id="description" + name="Description" + rows="3" + placeholder="Entwicklung einer mobilen App zur Anforderungserfassung unterwegs.">{{ .Data.Form.Project.Description }}</textarea> + </div> + + <!-- Date Fields Row: Start and End Date --> + <div class="row"> + <!-- Start Date Field --> + <div class="col-md-6 mb-3"> + <label for="startDate" class="form-label">Startdatum *</label> + <input type="date" + class="form-control" + id="startDate" + name="StartDate" + value="{{ .Data.Form.Project.StartDate.Format "2006-01-02" }}" + required> + </div> + + <!-- End Date Field --> + <div class="col-md-6 mb-3"> + <label for="endDate" class="form-label">Enddatum *</label> + <input type="date" + class="form-control" + id="endDate" + name="EndDate" + value="{{ .Data.Form.Project.EndDate.Format "2006-01-02" }}" + required> + </div> + </div> + + <!-- Form Action Buttons --> + <div class="d-flex justify-content-between"> + <!-- Back to list button (left side) --> + <a href="/project/list" + hx-boost="true" + hx-target="body" + class="btn btn-secondary"> + â¬…ï¸ Zurück zur Übersicht + </a> + + <!-- Submit button (right side, text changes based on form type) --> + <button type="submit" class="btn btn-primary"> + {{ if $isEdit }} + ✅ Änderungen speichern + {{ else }} + âž• Projekt erstellen + {{ end }} + </button> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +{{ end }} \ No newline at end of file diff --git a/templates/project/_list.go.html b/templates/project/_list.go.html new file mode 100644 index 0000000000000000000000000000000000000000..2bf782ce9efe100d445d4322d11405cfb12a44d6 --- /dev/null +++ b/templates/project/_list.go.html @@ -0,0 +1,150 @@ +{{ define "project.list" }} + <div class="project-list"> + <!-- Check if user has any projects - show empty state if none exist --> + {{ if not .Data.Projects }} + <!-- Empty state: Encourage user to create their first project --> + <div class="alert alert-info text-center"> + <h5>Noch keine Projekte vorhanden</h5> + <p>Erstellen Sie Ihr erstes Projekt, um mit der Anforderungserfassung zu beginnen.</p> + <!-- HTMX-powered button for seamless navigation without page reload --> + <button hx-get="/project/new" + hx-target="body" + hx-boost="true" + class="btn btn-primary"> + Erstes Projekt erstellen + </button> + </div> + {{ else }} + <!-- Projects exist: Display them in a responsive grid layout --> + <div class="row"> + <!-- Loop through each project and create a card for it --> + {{ range .Data.Projects }} + <div class="col-md-6 col-lg-4 mb-4"> + <!-- Bootstrap card component with shadow for visual depth --> + <div class="card h-100 shadow-sm project-card"> + + <!-- Card header with project ID and actions dropdown --> + <div class="card-header d-flex justify-content-between align-items-center"> + <!-- Display human-readable project ID (e.g., PRJ-2025-001) --> + <h6 class="mb-0 text-muted">{{ .ProjectID }}</h6> + + <!-- Bootstrap dropdown for project actions (edit, delete) --> + <div class="dropdown"> + <button class="btn btn-sm btn-outline-secondary dropdown-toggle" + type="button" + data-bs-toggle="dropdown"> + â‹® + </button> + <ul class="dropdown-menu"> + <li> + <!-- Edit link using HTMX for seamless navigation --> + <a class="dropdown-item" + href="/project/{{ .ID.Hex }}/edit" + hx-boost="true" + hx-target="body"> + âœï¸ Bearbeiten + </a> + </li> + <li><hr class="dropdown-divider"></li> + <li> + <!-- Delete button triggers modal for confirmation --> + <button class="dropdown-item text-danger" + data-bs-toggle="modal" + data-bs-target="#deleteModal-{{ .ID.Hex }}"> + ðŸ—‘ï¸ Löschen + </button> + </li> + </ul> + </div> + </div> + + <!-- Card body with main project information --> + <div class="card-body"> + <!-- Project name as clickable title leading to detail view --> + <h5 class="card-title"> + <a href="/project/{{ .ID.Hex }}" + hx-boost="true" + hx-target="body" + class="text-decoration-none"> + {{ .Name }} + </a> + </h5> + + <!-- Project description with fallback for empty descriptions --> + <p class="card-text text-muted"> + {{ if .Description }} + {{ .Description }} + {{ else }} + Keine Beschreibung verfügbar + {{ end }} + </p> + + <!-- Project timeline showing start and end dates --> + <div class="d-flex justify-content-between text-small text-muted"> + <span> + 📅 {{ .StartDate.Format "02.01.2006" }} + </span> + <span> + ðŸ {{ .EndDate.Format "02.01.2006" }} + </span> + </div> + </div> + + <!-- Card footer with metadata and status information --> + <div class="card-footer bg-transparent"> + <div class="d-flex justify-content-between align-items-center"> + <!-- Creation date for audit purposes --> + <small class="text-muted"> + Erstellt: {{ .CreatedAt.Format "02.01.2006" }} + </small> + <!-- Requirements count badge (currently hardcoded to 0) --> + <span class="badge bg-secondary"> + 0 Anforderungen + </span> + </div> + </div> + </div> + </div> + + <!-- Delete confirmation modal for each project --> + <!-- Each modal has a unique ID based on the project's MongoDB ObjectID --> + <div class="modal fade" id="deleteModal-{{ .ID.Hex }}" tabindex="-1"> + <div class="modal-dialog"> + <div class="modal-content"> + <!-- Modal header with title and close button --> + <div class="modal-header"> + <h5 class="modal-title">Projekt löschen</h5> + <button type="button" class="btn-close" data-bs-dismiss="modal"></button> + </div> + + <!-- Modal body with confirmation message and warning --> + <div class="modal-body"> + <p>Möchten Sie das Projekt <strong>"{{ .Name }}"</strong> wirklich löschen?</p> + <!-- Warning about cascading deletion of requirements --> + <div class="alert alert-warning"> + âš ï¸ <strong>Achtung:</strong> Alle zugehörigen Anforderungen werden ebenfalls gelöscht! + </div> + </div> + + <!-- Modal footer with cancel and confirm buttons --> + <div class="modal-footer"> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> + Abbrechen + </button> + <!-- HTMX DELETE request that updates the project list after deletion --> + <button hx-delete="/project/{{ .ID.Hex }}" + hx-target="#project-list" + hx-swap="outerHTML" + data-bs-dismiss="modal" + class="btn btn-danger"> + Projekt löschen + </button> + </div> + </div> + </div> + </div> + {{ end }} + </div> + {{ end }} + </div> +{{ end }} \ No newline at end of file diff --git a/templates/project/_requirements-list.go.html b/templates/project/_requirements-list.go.html new file mode 100644 index 0000000000000000000000000000000000000000..0a1b2c562acc04d786998bed0cf00754100a2a1a --- /dev/null +++ b/templates/project/_requirements-list.go.html @@ -0,0 +1,92 @@ +{{ define "project.requirements.list" }} + <div class="requirements-list"> + <!-- Check if project has any requirements --> + {{ if not .Data.Project.Requirements }} + <!-- Empty state: No requirements exist yet --> + <div class="alert alert-info text-center"> + <h5>Noch keine Anforderungen</h5> + <p class="text-muted">Erstellen Sie die erste Anforderung für dieses Projekt.</p> + <!-- Link to EIFFEL system for requirement creation --> + <!-- Pre-fills the project ID for automatic association --> + <a href="/eiffel?project={{ .Data.Project.ProjectID }}" + class="btn btn-primary" + hx-boost="true" + hx-target="body"> + âž• Erste Anforderung erstellen + </a> + </div> + {{ else }} + <!-- Requirements exist: Display them in a table format --> + <div class="table-responsive"> + <table class="table table-hover"> + <!-- Table header with column definitions --> + <thead class="table-light"> + <tr> + <th style="width: 100px;">ID</th> <!-- Requirement identifier --> + <th style="width: 80px;">Status</th> <!-- Current requirement status --> + <th>Anforderung</th> <!-- Requirement text (flexible width) --> + <th style="width: 100px;">Aktionen</th> <!-- Action buttons --> + </tr> + </thead> + <tbody> + <!-- Loop through each requirement and create a table row --> + {{ range .Data.Project.Requirements }} + <!-- Each row has a unique ID for potential JavaScript targeting --> + <tr id="requirement-{{ .ID.Hex }}"> + <!-- Requirement ID Column: Display human-readable identifier --> + <td> + <span class="badge bg-light text-dark"> + {{ .RequirementID }} + </span> + </td> + + <!-- Status Column: Dropdown for changing requirement status --> + <td> + <select class="form-select form-select-sm"> + <!-- Loop through available status options --> + {{ range $.Data.RequirementStatuses }} + <!-- Mark current status as selected --> + <option value="{{ . }}" + {{ if eq . $.Status }}selected{{ end }}> + {{ . }} + </option> + {{ end }} + </select> + </td> + + <!-- Requirement Text Column: Show truncated text with tooltip --> + <td> + <!-- Bootstrap tooltip shows full text on hover --> + <div class="requirement-text" + data-bs-toggle="tooltip" + title="{{ .Requirement }}"> + <!-- Truncate long requirements for table readability --> + {{ if gt (len .Requirement) 80 }} + {{ slice .Requirement 0 80 }}... + {{ else }} + {{ .Requirement }} + {{ end }} + </div> + </td> + + <!-- Actions Column: Buttons for requirement operations --> + <td> + <div class="btn-group btn-group-sm"> + <!-- Clone requirement button --> + <button class="btn btn-outline-secondary" title="Klonen"> + 📋 + </button> + <!-- Delete requirement button --> + <button class="btn btn-outline-danger" title="Löschen"> + ðŸ—‘ï¸ + </button> + </div> + </td> + </tr> + {{ end }} + </tbody> + </table> + </div> + {{ end }} + </div> +{{ end }} \ No newline at end of file diff --git a/templates/project/detail-page.go.html b/templates/project/detail-page.go.html new file mode 100644 index 0000000000000000000000000000000000000000..46fd2fe193fdf1f3e18b4946953f927b50d4c70a --- /dev/null +++ b/templates/project/detail-page.go.html @@ -0,0 +1,7 @@ +{{ define "project.detail.page" }} + {{ template "index" . }} +{{ end }} + +{{ define "content" }} + {{ template "project.detail" . }} +{{ end }} diff --git a/templates/project/form-page.go.html b/templates/project/form-page.go.html new file mode 100644 index 0000000000000000000000000000000000000000..b61f864ab923a434feaa80c889358718574a16a0 --- /dev/null +++ b/templates/project/form-page.go.html @@ -0,0 +1,7 @@ +{{ define "project.form.page" }} + {{ template "index" . }} +{{ end }} + +{{ define "content" }} + {{ template "project.form" . }} +{{ end }} diff --git a/templates/project/list-page.go.html b/templates/project/list-page.go.html new file mode 100644 index 0000000000000000000000000000000000000000..9d3e80d09e070c69e26e73f47be63809cd642f2f --- /dev/null +++ b/templates/project/list-page.go.html @@ -0,0 +1,40 @@ +{{ define "project.list.page" }} + {{ template "index" . }} +{{ end }} + +{{ define "content" }} + <div class="project-list-container"> + <div class="project-list-header row mb-4"> + <div class="col-6"> + <h1>Projekt-Sammlung</h1> + <p class="text-muted">Verwalten Sie alle Ihre Projekte und deren Anforderungen an einem Ort.</p> + </div> + <div class="col-3"> + <button hx-get="/project/new" + hx-target="body" + hx-boost="true" + class="btn btn-primary"> + + Neues Projekt + </button> + </div> + <div class="col-3"> + <div class="input-group"> + <input type="search" + class="form-control" + placeholder="Suche nach Projekten..." + hx-post="/project/search" + hx-trigger="input changed delay:300ms, search" + hx-target="#project-list" + name="search"> + <button class="btn btn-outline-secondary" type="button"> + 🔠+ </button> + </div> + </div> + </div> + + <div id="project-list"> + {{ template "project.list" . }} + </div> + </div> +{{ end }} diff --git a/templates/project/test.go.html b/templates/project/test.go.html new file mode 100644 index 0000000000000000000000000000000000000000..42acab5786dcd9401e195ce2678c299a0d2df55d --- /dev/null +++ b/templates/project/test.go.html @@ -0,0 +1,211 @@ +<!--{{ define "requirement-collection" }}--> + + +<!-- +<!DOCTYPE html> +<html lang="de"> +<head> + <meta charset="UTF-8"> + <title>Anforderungsübersicht</title> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" + rel="stylesheet" + /> +</head> +<body> + <div class="container mt-5"> + <h1>Anforderungsübersicht</h1> + +<table class="table table-hover"> + <thead class="table-dark"> + <tr> + <th scope="col">ID</th> + <th scope="col">Beschreibung</th> + <th scope="col">Status</th> + <th scope="col">Aktionen</th> + </tr> + </thead> + <tbody class="table-group-divider"> + <tr> + <th scope="row">1</th> + <td>Mark</td> + <td>Otto</td> + <td>@mdo</td> + </tr> + <tr> + <th scope="row">2</th> + <td>Jacob</td> + <td>Thornton</td> + <td>@fat</td> + </tr> + <tr> + <th scope="row">3</th> + <td>John</td> + <td>Doe</td> + <td>@social</td> + </tr> + + </tbody> +</table> +</body> +</html> +--> + + + + + + +<!-- + +<!DOCTYPE html> +<html lang="de"> +<head> + <meta charset="UTF-8" /> + <title>Anforderungsübersicht</title> +<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" /> +<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script> +</head> +<body> + <div class="container mt-5"> + <h1>Anforderungsübersicht</h1> + + <form class="d-flex" role="search"> + <input class="form-control me-2" type="search" placeholder="Suche" aria-label="Suche"> + <button class="btn btn-outline-success" type="submit" aria-label="Suchen"> + <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-search" viewBox="0 0 16 16"> + <path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001q.044.06.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1 1 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0"/> + </svg> + </button> +</form> + + + <table class="table table-hover"> + <thead class="table-dark"> + <tr> + <th>ID</th> + <th>Beschreibung</th> + <th>Status</th> + <th>Aktionen</th> + </tr> + </thead> + <tbody class="table-group-divider"> + {{range .Requirements}} + <tr> + <td>{{.ID}}</td> + <td>{{.Beschreibung}}</td> + <td> + <div class="dropdown"> + <button class="btn btn-secondary btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false"> + Offen + </button> + <ul class="dropdown-menu"> + <li><a class="dropdown-item" href="#">Offen</a></li> + <li><a class="dropdown-item" href="#">In Bearbeitung</a></li> + <li><a class="dropdown-item" href="#">Geschlossen</a></li> + </ul> + </div> + </td> + <td><button class="btn btn-sm btn-primary">Bearbeiten</button></td> + </tr> + {{else}} + <tr> + <td colspan="4" class="text-center">Keine Anforderungen vorhanden</td> + </tr> + {{end}} + </tbody> + </table> + </div> +</body> +</html> +--> + + + + + + +<!DOCTYPE html> +<html lang="de"> +<head> + <meta charset="UTF-8" /> + <title>Anforderungsübersicht</title> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" /> + + + <style> + .search-input-wrapper { + position: relative; + width: 100%; + max-width: 400px; /* Optional, max Breite */ + } + .search-input-wrapper svg { + position: absolute; + left: 12px; + top: 50%; + transform: translateY(-50%); + cursor: pointer; + color: #6c757d; /* Bootstrap Grauton */ + width: 16px; + height: 16px; + z-index: 2; + pointer-events: auto; + } + .search-input-wrapper input { + padding-left: 38px; /* Platz für Icon */ + } + </style> +</head> +<body> + <div class="container mt-5"> + <h1>Anforderungsübersicht</h1> + <!-- This is the Search bar --> + <form class="d-flex" role="search" onsubmit="event.preventDefault(); alert('Suche: ' + document.getElementById('searchInput').value);"> + <div class="search-input-wrapper me-2"> + <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-search" viewBox="0 0 16 16" onclick="document.getElementById('searchInput').focus();" aria-label="Such-Icon" role="button" tabindex="0" onkeydown="if(event.key==='Enter' || event.key===' ') { event.preventDefault(); document.getElementById('searchInput').focus(); }"> + <path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001q.044.06.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1 1 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0"/> + </svg> + <input id="searchInput" class="form-control" type="search" placeholder="Suche" aria-label="Suche" /> + </div> + <button class="btn btn-outline-success" type="submit" aria-label="Suchen">Suchen</button> + </form> + + <!--This is the Table with a hover function--> + <table class="table table-hover mt-4"> + <thead class="table-dark"> + <tr> + <th>ID</th> + <th>Beschreibung</th> + <th>Status</th> + <th>Aktionen</th> + </tr> + </thead> + <tbody class="table-group-divider"> + {{range .Requirements}} + <tr> + <td>{{.ID}}</td> + <td>{{.Beschreibung}}</td> + <td> + <div class="dropdown"> + <button class="btn btn-secondary btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false"> + Offen + </button> + <ul class="dropdown-menu"> + <li><a class="dropdown-item" href="#">Offen</a></li> + <li><a class="dropdown-item" href="#">In Bearbeitung</a></li> + <li><a class="dropdown-item" href="#">Geschlossen</a></li> + </ul> + </div> + </td> + <td><button class="btn btn-sm btn-primary">Bearbeiten</button></td> + </tr> + {{else}} + <tr> + <td colspan="4" class="text-center">Keine Anforderungen vorhanden</td> + </tr> + {{end}} + </tbody> + </table> + </div> + <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script> +</body> +</html>