Free and open source ticket system written in python
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

๐Ÿ‘Œ IMPROVE: add status link to dashboard view

+239 -6
+5 -1
.dockerignore
··· 1 1 .env 2 - *.sqlite3 2 + *.sqlite3 3 + .gitattributes 4 + .gitignore 5 + .prettierignore 6 + CONTRIBUTING.md
+1 -1
paw/__init__.py
··· 1 1 from django import get_version 2 2 3 - VERSION = (0, 5, 3, "final", 0) 3 + VERSION = (0, 5, 4, "final", 0) 4 4 5 5 __version__ = get_version(VERSION)
+224
paw/static/css/paw.css
··· 3079 3079 margin-top: 2rem; 3080 3080 } 3081 3081 3082 + .mt-6 { 3083 + margin-top: 1.5rem; 3084 + } 3085 + 3082 3086 .block { 3083 3087 display: block; 3084 3088 } ··· 3478 3482 } 3479 3483 3480 3484 @media (min-width: 1024px) { 3485 + .lg\:btn { 3486 + display: inline-flex; 3487 + height: 3rem; 3488 + min-height: 3rem; 3489 + flex-shrink: 0; 3490 + cursor: pointer; 3491 + -webkit-user-select: none; 3492 + -moz-user-select: none; 3493 + user-select: none; 3494 + flex-wrap: wrap; 3495 + align-items: center; 3496 + justify-content: center; 3497 + border-radius: var(--rounded-btn, 0.5rem); 3498 + border-color: transparent; 3499 + border-color: oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity)); 3500 + padding-left: 1rem; 3501 + padding-right: 1rem; 3502 + text-align: center; 3503 + font-size: 0.875rem; 3504 + line-height: 1em; 3505 + gap: 0.5rem; 3506 + font-weight: 600; 3507 + text-decoration-line: none; 3508 + transition-duration: 200ms; 3509 + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); 3510 + border-width: var(--border-btn, 1px); 3511 + animation: button-pop var(--animation-btn, 0.25s) ease-out; 3512 + transition-property: color, background-color, border-color, opacity, box-shadow, transform; 3513 + --tw-text-opacity: 1; 3514 + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); 3515 + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); 3516 + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); 3517 + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 3518 + outline-color: var(--fallback-bc,oklch(var(--bc)/1)); 3519 + background-color: oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity)); 3520 + --tw-bg-opacity: 1; 3521 + --tw-border-opacity: 1; 3522 + } 3523 + 3524 + .lg\:btn[disabled],.lg\:btn:disabled { 3525 + pointer-events: none; 3526 + } 3527 + 3528 + :where(.lg\:btn:is(input[type="checkbox"])), 3529 + :where(.lg\:btn:is(input[type="radio"])) { 3530 + width: auto; 3531 + -webkit-appearance: none; 3532 + -moz-appearance: none; 3533 + appearance: none; 3534 + } 3535 + 3536 + .lg\:btn:is(input[type="checkbox"]):after,.lg\:btn:is(input[type="radio"]):after { 3537 + --tw-content: attr(aria-label); 3538 + content: var(--tw-content); 3539 + } 3540 + 3541 + @media (hover: hover) { 3542 + .lg\:btn:hover { 3543 + --tw-border-opacity: 1; 3544 + border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity))); 3545 + --tw-bg-opacity: 1; 3546 + background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity))); 3547 + } 3548 + 3549 + @supports (color: color-mix(in oklab, black, black)) { 3550 + .lg\:btn:hover { 3551 + background-color: color-mix( 3552 + in oklab, 3553 + oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%, 3554 + black 3555 + ); 3556 + border-color: color-mix( 3557 + in oklab, 3558 + oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%, 3559 + black 3560 + ); 3561 + } 3562 + } 3563 + 3564 + @supports not (color: oklch(0 0 0)) { 3565 + .lg\:btn:hover { 3566 + background-color: var(--btn-color, var(--fallback-b2)); 3567 + border-color: var(--btn-color, var(--fallback-b2)); 3568 + } 3569 + } 3570 + 3571 + .lg\:btn:hover { 3572 + --tw-border-opacity: 1; 3573 + border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity))); 3574 + --tw-bg-opacity: 1; 3575 + background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity))); 3576 + } 3577 + 3578 + @supports (color: color-mix(in oklab, black, black)) { 3579 + .lg\:btn:hover { 3580 + background-color: color-mix( 3581 + in oklab, 3582 + oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%, 3583 + black 3584 + ); 3585 + border-color: color-mix( 3586 + in oklab, 3587 + oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%, 3588 + black 3589 + ); 3590 + } 3591 + } 3592 + 3593 + @supports not (color: oklch(0 0 0)) { 3594 + .lg\:btn:hover { 3595 + background-color: var(--btn-color, var(--fallback-b2)); 3596 + border-color: var(--btn-color, var(--fallback-b2)); 3597 + } 3598 + } 3599 + 3600 + .lg\:btn:hover { 3601 + --tw-border-opacity: 1; 3602 + border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity))); 3603 + --tw-bg-opacity: 1; 3604 + background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity))); 3605 + } 3606 + 3607 + @supports (color: color-mix(in oklab, black, black)) { 3608 + .lg\:btn:hover { 3609 + background-color: color-mix( 3610 + in oklab, 3611 + oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%, 3612 + black 3613 + ); 3614 + border-color: color-mix( 3615 + in oklab, 3616 + oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%, 3617 + black 3618 + ); 3619 + } 3620 + } 3621 + 3622 + @supports not (color: oklch(0 0 0)) { 3623 + .lg\:btn:hover { 3624 + background-color: var(--btn-color, var(--fallback-b2)); 3625 + border-color: var(--btn-color, var(--fallback-b2)); 3626 + } 3627 + } 3628 + 3629 + .lg\:btn.glass:hover { 3630 + --glass-opacity: 25%; 3631 + --glass-border-opacity: 15%; 3632 + } 3633 + 3634 + .lg\:btn[disabled]:hover,.lg\:btn:disabled:hover { 3635 + --tw-border-opacity: 0; 3636 + background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); 3637 + --tw-bg-opacity: 0.2; 3638 + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); 3639 + --tw-text-opacity: 0.2; 3640 + } 3641 + 3642 + @supports (color: color-mix(in oklab, black, black)) { 3643 + .lg\:btn:is(input[type="checkbox"]:checked):hover,.lg\:btn:is(input[type="radio"]:checked):hover { 3644 + background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); 3645 + border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); 3646 + } 3647 + } 3648 + } 3649 + 3650 + .lg\:btn:active:hover,.lg\:btn:active:focus { 3651 + animation: button-pop 0s ease-out; 3652 + transform: scale(var(--btn-focus-scale, 0.97)); 3653 + } 3654 + 3655 + @supports not (color: oklch(0 0 0)) { 3656 + .lg\:btn { 3657 + background-color: var(--btn-color, var(--fallback-b2)); 3658 + border-color: var(--btn-color, var(--fallback-b2)); 3659 + } 3660 + } 3661 + 3662 + .lg\:btn:focus-visible { 3663 + outline-style: solid; 3664 + outline-width: 2px; 3665 + outline-offset: 2px; 3666 + } 3667 + 3668 + .lg\:btn.glass { 3669 + --tw-shadow: 0 0 #0000; 3670 + --tw-shadow-colored: 0 0 #0000; 3671 + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 3672 + outline-color: currentColor; 3673 + } 3674 + 3675 + .lg\:btn.glass.btn-active { 3676 + --glass-opacity: 25%; 3677 + --glass-border-opacity: 15%; 3678 + } 3679 + 3680 + .lg\:btn.btn-disabled,.lg\:btn[disabled],.lg\:btn:disabled { 3681 + --tw-border-opacity: 0; 3682 + background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); 3683 + --tw-bg-opacity: 0.2; 3684 + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); 3685 + --tw-text-opacity: 0.2; 3686 + } 3687 + 3688 + .lg\:btn:is(input[type="checkbox"]:checked),.lg\:btn:is(input[type="radio"]:checked) { 3689 + --tw-border-opacity: 1; 3690 + border-color: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity))); 3691 + --tw-bg-opacity: 1; 3692 + background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity))); 3693 + --tw-text-opacity: 1; 3694 + color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); 3695 + } 3696 + 3697 + .lg\:btn:is(input[type="checkbox"]:checked):focus-visible,.lg\:btn:is(input[type="radio"]:checked):focus-visible { 3698 + outline-color: var(--fallback-p,oklch(var(--p)/1)); 3699 + } 3700 + 3481 3701 .lg\:btn-sm { 3482 3702 height: 2rem; 3483 3703 min-height: 2rem; ··· 3558 3778 3559 3779 .lg\:max-w-md { 3560 3780 max-width: 28rem; 3781 + } 3782 + 3783 + .lg\:max-w-sm { 3784 + max-width: 24rem; 3561 3785 } 3562 3786 3563 3787 .lg\:flex-row {
+8 -4
paw/templates/dashboard_base.html
··· 18 18 {% include 'partials/logo.html' with responsive=True %} 19 19 </a> 20 20 <a href="{% url 'create_ticket' %}" class="btn btn-ghost btn-square lg:w-full lg:p-4 lg:btn-lg lg:justify-start"> 21 - <svg xmlns="http://www.w3.org/2000/svg" class="w-7 h-7" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" /><path d="M13.5 6.5l4 4" /></svg> 21 + <svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" /><path d="M13.5 6.5l4 4" /></svg> 22 22 <span class="hidden lg:block">{% trans 'Create Ticket' %}</span> 23 23 </a> 24 24 <a href="{% url 'all_tickets' %}" class="btn btn-ghost btn-square lg:w-full lg:p-4 lg:btn-lg lg:justify-start"> 25 - <svg xmlns="http://www.w3.org/2000/svg" class="w-7 h-7" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M15 5l0 2" /><path d="M15 11l0 2" /><path d="M15 17l0 2" /><path d="M5 5h14a2 2 0 0 1 2 2v3a2 2 0 0 0 0 4v3a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-3a2 2 0 0 0 0 -4v-3a2 2 0 0 1 2 -2" /></svg> 25 + <svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M15 5l0 2" /><path d="M15 11l0 2" /><path d="M15 17l0 2" /><path d="M5 5h14a2 2 0 0 1 2 2v3a2 2 0 0 0 0 4v3a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-3a2 2 0 0 0 0 -4v-3a2 2 0 0 1 2 -2" /></svg> 26 26 <span class="hidden lg:block">{% trans 'Tickets' %}</span> 27 27 </a> 28 28 <a href="{% url 'tickets_history' %}" class="btn btn-ghost btn-square lg:w-full lg:p-4 lg:btn-lg lg:justify-start"> 29 - <svg xmlns="http://www.w3.org/2000/svg" class="w-7 h-7" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 4m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v0a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z" /><path d="M5 8v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-10" /><path d="M10 12l4 0" /></svg> 29 + <svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 4m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v0a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z" /><path d="M5 8v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-10" /><path d="M10 12l4 0" /></svg> 30 30 <span class="hidden lg:block">{% trans 'History' %}</span> 31 31 </a> 32 32 33 33 <div class="flex-grow"></div> 34 - <div class="flex items-center py-2 lg:p-2 justify-center lg:justify-start"> 34 + <a href="{% url 'incident-list' %}" class="btn btn-ghost btn-square lg:w-full lg:p-4 lg:btn-lg lg:justify-start mt-10"> 35 + <svg xmlns="http://www.w3.org/2000/svg" class="w-6 h-6" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 18v-12a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z" /><path d="M7 14l3 -3l2 2l3 -3l2 2" /></svg> 36 + <span class="hidden lg:block">{% trans 'Status' %}</span> 37 + </a> 38 + <div class="flex items-center py-2 lg:p-2 justify-center lg:justify-start mt-6"> 35 39 <div class="avatar placeholder"> 36 40 <div class="bg-base-300 text-base-content rounded-full w-10"> 37 41 {% if request.user.profile_picture %}
+1
status/templates/status/.gitattributes
··· 1 + *.html linguist-language=html+django