added bootstar, font awsome, and the project is in a useable state, bit needs some manual setup.

This commit is contained in:
2026-06-13 23:11:54 +02:00
parent 4cf12c378e
commit 9045841645
5886 changed files with 538083 additions and 99 deletions

View File

@@ -0,0 +1,221 @@
<section class="admin-view" id="adminView" hidden>
<div class="admin-header">
<div>
<div class="viewer-key">Administration</div>
<h1>Admin</h1>
</div>
</div>
<div class="admin-layout">
<aside class="admin-nav" aria-label="Admin sections">
<button class="admin-nav-item is-active" type="button" data-admin-section="workflows">
<i class="fa-solid fa-diagram-project"></i>
<span>Workflows</span>
</button>
<button class="admin-nav-item" type="button" data-admin-section="options">
<i class="fa-solid fa-sliders"></i>
<span>Task Options</span>
</button>
<button class="admin-nav-item" type="button" data-admin-section="users">
<i class="fa-solid fa-users-gear"></i>
<span>Users</span>
</button>
</aside>
<section class="admin-panel" id="adminWorkflowsPanel">
<div class="admin-panel-header">
<div>
<h2>Edit Workflows</h2>
<p>Create task states, connect transitions, and assign states to task types.</p>
</div>
</div>
<div class="workflow-editor">
<section class="workflow-section">
<div class="workflow-section-header">
<h3>Global workflow definitions</h3>
<p>States and transitions are shared globally across task types.</p>
</div>
<div class="workflow-editor-grid">
<section class="workflow-card">
<h3>States</h3>
<form class="workflow-form" id="workflowStateForm">
<input class="form-control" name="name" placeholder="Open" required maxlength="128">
<input class="form-control form-control-color" type="color" name="color" value="#4ea1ff" aria-label="State color">
<button class="btn btn-primary btn-sm" type="submit">
<i class="fa-solid fa-plus me-1"></i>
Add State
</button>
</form>
<div class="workflow-list" id="workflowStateList"></div>
</section>
<section class="workflow-card">
<h3>Transitions</h3>
<form class="workflow-form workflow-form-stacked" id="workflowTransitionForm">
<select class="form-select" name="from_id" id="workflowTransitionFrom" required></select>
<select class="form-select" name="to_id" id="workflowTransitionTo" required></select>
<input class="form-control" name="action_name" placeholder="Close task" required maxlength="128">
<button class="btn btn-primary btn-sm" type="submit">
<i class="fa-solid fa-plus me-1"></i>
Add Transition
</button>
</form>
<div class="workflow-list" id="workflowTransitionList"></div>
</section>
</div>
</section>
<section class="workflow-section">
<div class="workflow-section-header">
<h3>Task type workflow</h3>
<p>Select a task type, assign its allowed states, choose the default state, and preview its graph.</p>
</div>
<section class="workflow-context-panel">
<div>
<label class="form-label" for="workflowTaskTypeSelect">Task Type</label>
<select class="form-select" id="workflowTaskTypeSelect"></select>
</div>
<div>
<label class="form-label" for="workflowDefaultStateSelect">Default State</label>
<select class="form-select" id="workflowDefaultStateSelect"></select>
</div>
</section>
<div class="workflow-editor-grid">
<section class="workflow-card">
<h3>Assigned States</h3>
<form class="workflow-form workflow-form-stacked" id="workflowAssignmentForm">
<select class="form-select" name="state" id="workflowAssignmentState" required></select>
<button class="btn btn-primary btn-sm" type="submit">
<i class="fa-solid fa-link me-1"></i>
Assign State
</button>
</form>
<div class="workflow-list" id="workflowAssignmentList"></div>
</section>
<section class="workflow-graph-panel">
<div class="workflow-graph-toolbar">
<strong>Workflow Graph</strong>
<button class="btn btn-sm btn-outline-secondary" type="button" id="workflowRefreshButton">
<i class="fa-solid fa-rotate me-1"></i>
Refresh
</button>
</div>
<div class="workflow-graph" id="workflowGraph"></div>
<div class="workflow-empty" id="workflowGraphEmpty" hidden>
Assign states to render the workflow graph.
</div>
</section>
</div>
</section>
</div>
</section>
<section class="admin-panel" id="adminOptionsPanel" hidden>
<div class="admin-panel-header">
<div>
<h2>Task Options</h2>
<p>Create and maintain the task types and priorities used across tasks.</p>
</div>
</div>
<div class="admin-options-grid">
<section class="workflow-card admin-option-card">
<h3>Task Types</h3>
<form class="admin-option-form" data-admin-option-form="type">
<input class="form-control" name="name" placeholder="Bug" required maxlength="20">
<input class="form-control" type="file" name="logo" accept=".svg,image/svg+xml" aria-label="Task type logo">
<button class="btn btn-primary btn-sm" type="submit">
<i class="fa-solid fa-plus me-1"></i>
Add Type
</button>
</form>
<div class="admin-type-editor">
<div>
<label class="form-label" for="adminTaskTypeSelect">Selected Type</label>
<select class="form-select" id="adminTaskTypeSelect"></select>
</div>
<div id="adminSelectedTypeEditor"></div>
<div class="admin-subsection">
<h4>Custom Fields</h4>
<form class="admin-custom-field-form" id="adminCustomFieldForm">
<input class="form-control" name="name" placeholder="Story points" required maxlength="128">
<select class="form-select" name="type" required>
<option value="string">String</option>
<option value="int">Int</option>
<option value="float">Float</option>
<option value="date">Date</option>
<option value="boolean">Boolean</option>
<option value="text">Text</option>
<option value="json">JSON</option>
</select>
<input class="form-control" name="value" placeholder="Default value">
<button class="btn btn-primary btn-sm" type="submit">
<i class="fa-solid fa-plus me-1"></i>
Add Field
</button>
</form>
<div class="admin-custom-field-list" id="adminCustomFieldList"></div>
</div>
</div>
</section>
<section class="workflow-card admin-option-card">
<h3>Task Priorities</h3>
<form class="admin-option-form" data-admin-option-form="priority">
<input class="form-control" name="name" placeholder="High" required maxlength="128">
<input class="form-control" type="file" name="logo" accept=".svg,image/svg+xml" aria-label="Task priority logo">
<button class="btn btn-primary btn-sm" type="submit">
<i class="fa-solid fa-plus me-1"></i>
Add Priority
</button>
</form>
<div class="admin-option-list" id="adminPriorityList"></div>
</section>
</div>
</section>
<section class="admin-panel" id="adminUsersPanel" hidden>
<div class="admin-panel-header">
<div>
<h2>Users</h2>
<p>Assign and remove global rights for users.</p>
</div>
</div>
<section class="workflow-card admin-option-card">
<h3>User Rights</h3>
<div class="admin-user-editor">
<div>
<label class="form-label" for="adminUserSelect">Selected User</label>
<select class="form-select" id="adminUserSelect"></select>
</div>
<div class="admin-user-rights" id="adminUserRightsList"></div>
</div>
</section>
</section>
</div>
</section>

View File

@@ -0,0 +1,6 @@
<section class="viewer-placeholder" id="dashboardView">
<div>
<h1>Dashboard</h1>
<p>Select a project, version or task from the sidebar.</p>
</div>
</section>

View File

@@ -0,0 +1,103 @@
<section class="profile-view" id="profileView" hidden>
<div class="profile-header">
<div>
<div class="viewer-key">Account</div>
<h1>Edit Profile</h1>
</div>
</div>
<form class="profile-layout" id="profileForm" enctype="multipart/form-data">
<section class="profile-avatar-panel">
<div class="profile-avatar-preview" id="profileAvatarPreview">
<span class="profile-avatar-fallback">
<i class="fa-solid fa-user"></i>
</span>
</div>
<label class="btn btn-outline-secondary btn-sm profile-picture-button">
<i class="fa-solid fa-image me-1"></i>
Upload picture
<input
type="file"
name="picture"
id="profilePictureInput"
accept="image/png,image/jpeg,image/webp,image/gif"
hidden
>
</label>
<label class="profile-remove-picture">
<input type="checkbox" name="remove_picture" value="1" id="profileRemovePicture">
Remove current picture
</label>
</section>
<section class="profile-form-panel">
<div class="mb-3">
<label class="form-label" for="profileName">Username</label>
<input
type="text"
class="form-control"
name="name"
id="profileName"
maxlength="128"
required
>
</div>
<div class="mb-3">
<label class="form-label" for="profileEmail">Email</label>
<input
type="email"
class="form-control"
name="email"
id="profileEmail"
maxlength="128"
required
>
</div>
<div class="mb-3">
<label class="form-label" for="profilePassword">New Password</label>
<input
type="password"
class="form-control"
name="password"
id="profilePassword"
minlength="8"
autocomplete="new-password"
>
</div>
<div class="mb-3">
<label class="form-label" for="profilePasswordConfirm">Confirm Password</label>
<input
type="password"
class="form-control"
id="profilePasswordConfirm"
minlength="8"
autocomplete="new-password"
>
</div>
<div class="mb-3">
<label class="form-label" for="profileTheme">Theme</label>
<select class="form-select" name="theme" id="profileTheme">
<option value="white">White</option>
<option value="dark">Dark</option>
<option value="purple">Purple</option>
<option value="green">Green</option>
<option value="beige">Beige</option>
</select>
</div>
<div class="profile-actions">
<button class="btn btn-primary" type="submit" id="profileSubmitButton">
<i class="fa-solid fa-floppy-disk me-1"></i>
Save Profile
</button>
<span class="profile-status" id="profileStatus" aria-live="polite"></span>
</div>
</section>
</form>
</section>

View File

@@ -0,0 +1,67 @@
<section class="project-view" id="projectView" hidden>
<div class="version-header">
<div>
<div class="viewer-key" id="projectKey"></div>
<div
class="project-editable version-title"
id="projectName"
data-project-field="name"
role="heading"
aria-level="1"
tabindex="0"
></div>
</div>
<?php if (!empty($canEditProjects)): ?>
<button class="btn btn-outline-secondary btn-sm" id="projectEditButton">
<i class="fa-solid fa-pen me-1"></i>
Edit
</button>
<?php endif; ?>
</div>
<div class="version-detail-grid">
<section class="version-panel">
<h2 class="section-title">Project</h2>
<div class="viewer-description">
<div class="meta-list">
<div class="meta-row">
<span class="meta-label">Key</span>
<span class="meta-value" id="projectId"></span>
</div>
<div class="meta-row">
<span class="meta-label">Name</span>
<span
class="meta-value project-editable version-inline-field"
id="projectInlineName"
data-project-field="name"
tabindex="0"
></span>
</div>
</div>
</div>
</section>
<aside class="version-panel">
<h2 class="section-title">Details</h2>
<div class="meta-list">
<div class="meta-row">
<span class="meta-label">Owner</span>
<span
class="meta-value project-editable version-inline-field"
id="projectOwner"
data-project-field="owner"
tabindex="0"
></span>
</div>
<div class="meta-row">
<span class="meta-label">Created</span>
<span class="meta-value" id="projectCreated"></span>
</div>
</div>
</aside>
</div>
</section>

View File

@@ -0,0 +1,138 @@
<section class="task-view task-detail-view" id="taskView" hidden>
<div class="task-detail-header">
<div class="task-detail-breadcrumb">
<span id="taskProject"></span>
<span>/</span>
<span id="taskKey"></span>
</div>
<div
class="task-editable task-detail-title"
id="taskTitle"
data-task-field="title"
role="heading"
aria-level="1"
tabindex="0"
></div>
<div class="task-detail-action-row">
<div class="task-detail-actions">
<?php if (!empty($canEditTasks)): ?>
<button class="btn btn-sm btn-outline-secondary" id="taskEditButton">
<i class="fa-solid fa-pen me-1"></i>
Edit
</button>
<?php endif; ?>
<button class="btn btn-sm btn-outline-secondary" id="taskCommentButton">
<i class="fa-solid fa-comment me-1"></i>
Comment
</button>
</div>
<div class="task-status-slot" id="taskStatusSlot"></div>
</div>
</div>
<div class="task-detail-grid">
<div class="task-detail-main">
<section class="task-detail-panel" id="taskCustomFieldsPanel" hidden>
<h2>Custom Fields</h2>
<div class="task-custom-field-list" id="taskCustomFieldList"></div>
</section>
<section class="task-detail-panel">
<h2>Description</h2>
<div
class="task-editable task-inline-field task-detail-description"
id="taskDescription"
data-task-field="description"
tabindex="0"
></div>
</section>
<section class="task-detail-panel task-comments-panel">
<h2>Comments</h2>
<form class="task-comment-form" id="taskCommentForm">
<textarea
class="form-control"
name="comment"
id="taskCommentInput"
rows="3"
placeholder="Add a comment..."
></textarea>
<div class="task-comment-actions">
<button class="btn btn-sm btn-primary" type="submit">
<i class="fa-solid fa-paper-plane me-1"></i>
Add Comment
</button>
<span class="task-comment-status" id="taskCommentStatus"></span>
</div>
</form>
<div class="task-comment-list" id="taskCommentList"></div>
<div class="text-secondary" id="taskCommentEmpty" hidden>
No comments yet.
</div>
</section>
</div>
<aside class="task-detail-side">
<section class="task-detail-panel">
<h2>Details</h2>
<div class="task-detail-meta">
<div class="task-detail-meta-row">
<span>Type</span>
<strong class="task-editable task-inline-field" id="taskType" data-task-field="type" tabindex="0"></strong>
</div>
<div class="task-detail-meta-row">
<span>Priority</span>
<strong class="task-editable task-inline-field" id="taskPriority" data-task-field="priority" tabindex="0"></strong>
</div>
<div class="task-detail-meta-row">
<span>Fix Version</span>
<strong class="task-editable task-inline-field" id="taskFixVersion" data-task-field="fix_version" tabindex="0"></strong>
</div>
<div class="task-detail-meta-row">
<span>Created</span>
<strong id="taskCreated"></strong>
</div>
<div class="task-detail-meta-row">
<span>Updated</span>
<strong id="taskUpdated"></strong>
</div>
</div>
</section>
<section class="task-detail-panel">
<h2>People</h2>
<div class="task-detail-meta">
<div class="task-detail-meta-row">
<span>Reporter</span>
<strong id="taskReporter"></strong>
</div>
<div class="task-detail-meta-row">
<span>Assignee</span>
<strong class="task-editable task-inline-field" id="taskAssignee" data-task-field="assignee" tabindex="0"></strong>
</div>
</div>
</section>
</aside>
</div>
</section>

View File

@@ -0,0 +1,43 @@
<section class="task-list-view" id="taskListView" hidden>
<div class="task-list-header">
<div>
<div class="viewer-key" id="taskListProjectKey"></div>
<h1 id="taskListTitle">Tasks</h1>
</div>
</div>
<div class="version-task-table project-task-table" id="projectTaskTable">
<div class="version-task-row version-task-head">
<button type="button" data-project-task-sort="id">
ID
<i class="fa-solid fa-sort"></i>
</button>
<button type="button" data-project-task-sort="title">
Name
<i class="fa-solid fa-sort"></i>
</button>
<button type="button" data-project-task-sort="type">
Type
<i class="fa-solid fa-sort"></i>
</button>
<button type="button" data-project-task-sort="priority">
Priority
<i class="fa-solid fa-sort"></i>
</button>
<button type="button" data-project-task-sort="assignee">
Assignee
<i class="fa-solid fa-sort"></i>
</button>
<button type="button" data-project-task-sort="status">
Status
<i class="fa-solid fa-sort"></i>
</button>
</div>
<div id="taskListContainer"></div>
</div>
<div class="version-task-pagination" id="projectTaskPagination"></div>
<div class="text-secondary" id="taskListEmpty" hidden>
No tasks found.
</div>
</section>

View File

@@ -0,0 +1,108 @@
<section class="version-view" id="versionView" hidden>
<div class="version-header">
<div>
<div class="viewer-key" id="versionKey"></div>
<div
class="version-editable version-title"
id="versionName"
data-version-field="name"
role="heading"
aria-level="1"
tabindex="0"
></div>
</div>
<?php if (!empty($canEditVersions)): ?>
<button class="btn btn-outline-secondary btn-sm" id="versionEditButton">
<i class="fa-solid fa-pen me-1"></i>
Edit
</button>
<?php endif; ?>
</div>
<div class="version-detail-grid">
<section class="version-panel">
<h2 class="section-title">Description</h2>
<div
class="version-editable version-inline-field viewer-description"
id="versionDescription"
data-version-field="description"
tabindex="0"
></div>
</section>
<aside class="version-panel">
<h2 class="section-title">Details</h2>
<div class="meta-list">
<div class="meta-row">
<span class="meta-label">Project</span>
<span class="meta-value" id="versionProject"></span>
</div>
<div class="meta-row">
<span class="meta-label">Created</span>
<span class="meta-value" id="versionCreated"></span>
</div>
<div class="meta-row">
<span class="meta-label">Due Date</span>
<span
class="meta-value version-editable version-inline-field"
id="versionDueDate"
data-version-field="due_date"
tabindex="0"
></span>
</div>
<div class="meta-row">
<span class="meta-label">Released</span>
<span
class="meta-value version-editable version-inline-field"
id="versionReleasedDate"
data-version-field="released_date"
tabindex="0"
></span>
</div>
</div>
</aside>
</div>
<section class="version-panel version-task-section">
<h2 class="section-title">Tasks</h2>
<div class="version-task-table" id="versionTaskTable">
<div class="version-task-row version-task-head">
<button type="button" data-version-task-sort="id">
ID
<i class="fa-solid fa-sort"></i>
</button>
<button type="button" data-version-task-sort="title">
Name
<i class="fa-solid fa-sort"></i>
</button>
<button type="button" data-version-task-sort="type">
Type
<i class="fa-solid fa-sort"></i>
</button>
<button type="button" data-version-task-sort="priority">
Priority
<i class="fa-solid fa-sort"></i>
</button>
<button type="button" data-version-task-sort="assignee">
Assignee
<i class="fa-solid fa-sort"></i>
</button>
<button type="button" data-version-task-sort="status">
Status
<i class="fa-solid fa-sort"></i>
</button>
</div>
<div id="versionTaskList"></div>
</div>
<div class="version-task-pagination" id="versionTaskPagination"></div>
<div class="text-secondary" id="versionTaskEmpty" hidden>
No tasks in this version.
</div>
</section>
</section>